【问题标题】:Custom Routing in MVC 4MVC 4 中的自定义路由
【发布时间】:2014-04-08 05:25:07
【问题描述】:

我有点犹豫在这里提出这个广泛的问题,但我找不到我需要用来研究这个的关键字。

我很难找到一种在 ASP.Net MVC 4(或 5)中使用自定义路由来重新创建我在网络上到处看到的内容的方法。

我需要的是,如果用户转到http://www.myApp.com/user1,路由将采用该路径并将其解释为http://www.myApp.com/Users/Index/user1,并在这种情况下将请求转发给正确的控制器Users,以及ID为的正确操作user1

我可以创建一个广泛的路由来捕获这个,但它会禁用我需要的所有默认路由,如果我让它顺流而下,默认路由将捕获这个并且用户将得到 404。

我想我可以手动将所有控制器路由,然后将这个放在最后以赶上其余的,但我真的不认为这是最好的解决方案,是吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 routes asp.net-mvc-routing


    【解决方案1】:

    这很棘手,因为用户名参数可能会覆盖同一控制器中的操作方法,甚至是其他控制器中的隐式操作方法。

    示例

    假设您的 HomeController 中有一个名为“Profile”的操作方法

    http://www.myapp.com/profile/

    在您的一位用户决定使用“个人资料”一词作为他们的用户名之前,一切都很好。突然,用户名配置文件可以覆盖操作方法配置文件,现在您的用户无法再访问配置文件页面。

    路由配置。

    这是您正在寻找的路线配置。当然这并不能解决前面提到的问题。您只需要阻止用户使用具有特殊含义的用户名即可。

    // /{username} configuration
    routes.MapRoute(
        name: "UserIndexRoute",
        url: "{username}",
        defaults: new { controller = "Users", action = "Index", username= UrlParameter.Optional },
        namespaces: new[] { "MyApp.Controllers" }
    );
    
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "MyApp.Controllers" }
    );
    

    【讨论】:

    • 您好 Yorro,您能否向我解释一下命名空间在这种情况下的作用?它们应该相同吗?我一回到家就试试这个代码。感谢您对此事的帮助! (P.S. 你上面提到的问题很容易缓解,因为我让用户选择他们的 url,然后我可以验证它,在上面的示例中将它作为用户名更容易)
    • @hjavaher - 命名空间帮助路由找到控制器。
    • 好的,我只是能够尝试一下(由于应用程序上的一些错误),你太棒了!!!!!!我一直在寻找这个解决方案很长一段时间了!
    【解决方案2】:

    我总是推荐http://attributerouting.net/,因为创建漂亮且对 seo 友好的网址要容易得多。

    使用属性路由,它看起来像这样:

    public class UserController : Controller
    {
         [GET("/users/{userName}")]
         public ActionResult UserRedirect(string userName)
         {
             return RedirectToAction(User, new { userName = userName });
         }
    
         [GET("/users/index/{userName}")]
         public ActionResult User(string userName)
         {
             return RedirectToAction(User, new { userName = userName });
         }
     }
    

    如果您使用的是 MVC 5,还有一个内置的属性机制。如果你不想使用属性,你必须使用一些黑名单,这样用户名才不会被解释为动作名称:

    http://weblogs.asp.net/jasonconway/archive/2009/10/23/include-and-exclude-constraints-in-asp-net-mvc.aspx

    【讨论】:

    • 嗨,谢谢你的帮助,这对abc.com/username1 有用吗?我不熟悉属性路由以及我现在阅读它的方式,我认为这只有在用户访问时才有效abc.com/users/username1
    • 属性路由适用于不同的 url,您不需要模式,因为它们总是为每个属性方法创建一个路由。
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多