繁体   English   中英

MVC 4中的自定义路由

[英]Custom Routing in MVC 4

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

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

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

我可以创建一个宽泛的Route来捕获此路由,但是它将禁用我需要的所有默认路由,如果我将其沿着管道传输,则默认路由将捕获此路由,并且用户将获得404。

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

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

假设您的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" }
);

我总是建议http://attributerouting.net/ ,因为创建漂亮且对seo友好的url非常容易。

使用属性路由,它将如下所示:

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,则还有一个内置的属性机制。 如果您不想使用属性,则必须使用一些黑名单,以便用户名ist不能解释为动作名称:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM