[英]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”的操作方法
一切正常,直到您的一位用户决定使用“个人资料”一词作为用户名。 突然,用户名配置文件可能会覆盖操作方法配置文件,现在您的用户无法再访问该配置文件页面。
路由配置。
这是您要查找的路由配置。 当然,这不能解决前面提到的问题。 您只需要阻止用户使用具有特殊含义的用户名即可。
// /{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不能解释为动作名称:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.