我想为我的用户提供一个虚荣心网址,比如:
www.foo.com/sergio
我需要创造什么样的路线?
假设我有以下控制器和操作,如何将虚空URL映射到该控制器?
public ActionResult Profile(string username)
{
var model = LoadProfile(username);
return View(model);
}
下面是我尝试过的事情和发生的事情:
备选案文A:
每个url都在这个路径中被捕获,这意味着我输入的每个URL都指向帐户控制器,而不仅仅是foo.com/[USERNAME]
。不是很好。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Profile",
"{username}",
new { controller = "Account", action = "Profile", username = UrlParameter.Optional }
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
}
备选方案B:
默认路由运行良好,但是当尝试访问配置文件foo.com/[USERNAME]
时,我会得到HTTP404错误。
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);
routes.MapRoute(
"DentistProfile",
"{username}",
new { controller = "Account", action = "Profile", username = UrlParameter.Optional }
);
}
发布于 2012-11-30 08:07:49
一种解决方案可以是使用自定义路由约束,
public class VanityUrlContraint : IRouteConstraint
{
private static readonly string[] Controllers =
Assembly.GetExecutingAssembly().GetTypes().Where(x => typeof(IController).IsAssignableFrom(x))
.Select(x => x.Name.ToLower().Replace("controller", "")).ToArray();
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
RouteDirection routeDirection)
{
return !Controllers.Contains(values[parameterName].ToString().ToLower());
}
}
并把它当作
routes.MapRoute(
name: "Profile",
url: "{username}",
defaults: new {controller = "Account", action = "Profile"},
constraints: new { username = new VanityUrlContraint() }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
这种方法的缺点是,与现有控制器名称相同的用户名配置文件视图将无法工作,例如,如果项目中存在“资产”、“位置”和"AssetController“、"LocationController”等用户名,则“资产”、“位置”的配置文件视图将无法工作。
希望这能有所帮助。
发布于 2012-11-27 18:09:44
你试过:
routes.MapRoute(
"YourRouteName",
"{username}",
new {controller="YourController", action="Profile", username=UrlParameter.Optional}
);
这应该会诱捕www.foo.com/{username}。请记住,按添加路由的顺序检查路由,这样就可以添加
routes.MapRoute(
"default",
"{controller}/{action}/{input}",
new {controller="controller", action="action", input=UrlParameter.Optional}
);
首先要维护“默认”行为。
https://stackoverflow.com/questions/13558541
复制相似问题