ASP.Net MVC3:设置路由以处理多个唯一ID';s
我正在构建一个MVC应用程序,它由两个不同的唯一ID可以引用的实体组成,一个丑陋的系统生成ID和一个更友好的5字符“短代码”。例如,我希望最终用户能够在浏览器中键入以下url: 同样,这两种代码都是唯一的。我已正确设置了第一个URL的路由。当用户输入该URL时,他们将收到显示实体索引页的正确页面:PRJ201104 如何设置路线以处理第二种情况?最好有一种方法可以“欺骗”MVC,使其将传递给控制器的值从短代码更改为项目 我想要一种截取5个字符的短代码路由的方法,获取提供的值并在我的entities表中查找它,然后如果我找到匹配的记录,我想要(按照优先顺序):ASP.Net MVC3:设置路由以处理多个唯一ID';s,asp.net,asp.net-mvc-3,routes,controllers,Asp.net,Asp.net Mvc 3,Routes,Controllers,我正在构建一个MVC应用程序,它由两个不同的唯一ID可以引用的实体组成,一个丑陋的系统生成ID和一个更友好的5字符“短代码”。例如,我希望最终用户能够在浏览器中键入以下url: 同样,这两种代码都是唯一的。我已正确设置了第一个URL的路由。当用户输入该URL时,他们将收到显示实体索引页的正确页面:PRJ201104 如何设置路线以处理第二种情况?最好有一种方法可以“欺骗”MVC,使其将传递给控制器的值从短代码更改为项目 我想要一种截取5个字符的短代码路由的方法,获取提供的值并在我的entit
TIA自定义路由可以完成以下任务:
public class MyRoute : Route
{
public MyRoute(string url, object defaults)
: base(url, new RouteValueDictionary(defaults), new MvcRouteHandler())
{ }
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var rd = base.GetRouteData(httpContext);
var id = rd.Values["id"] as string;
if (id == null)
{
return rd;
}
// TODO: if you think that the id provided is a pretty id
// query the database to fetch the other id
if (IsPrettyId(id))
{
id = FetchCorrespondingId(id);
rd.Values["id"] = id;
}
return rd;
}
}
然后注册此自定义路由:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(
"Default",
new MyRoute(
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
)
);
}
现在,在控制器操作中,您将始终具有长而丑陋的id:
public ActionResult Index(string id)
{
}
我想差不多了。url:解析正确。但现在,url没有。有没有一种方法可以向自定义路由添加约束,这样它只能通过正则表达式匹配来选择工作?@Leon,当然,只需使用另一个接受约束的路由构造函数重载。请提供一些关于如何实现该重载的帮助?我想不出正确的语法。太接近了。@Leon,当您调用:base构造函数时,还有其他重载。
公共MyRoute(字符串url、对象默认值、对象约束):base(url、新RouteValueDictionary(默认值)、新RouteValueDictionary(约束)、新MvcRouteHandler())
。