我正在构建一个MVC应用程序,该应用程序由两个不同的唯一ID引用的实体组成,一个丑陋的系统生成的ID,以及一个用户友好的5个字符“短代码”。例如,我希望我的最终用户能够在他们的浏览器中输入以下网址:
同样,这两个代码都是唯一的。我有正确设置第一个URL的路由。当用户输入该URL时,他们会收到显示实体索引页的正确页面:PRJ201104。
如何设置处理第二种情况的路线?优选地,存在一种“欺骗”MVC以将其从短代码传递到控制器的值改变为项目的方法。
我想拦截5字符短代码路径,获取提供的值并在我的实体表中查找,然后如果我找到匹配的记录,我想要(按优先顺序):< / p>
如果我找不到使用该短代码值的匹配实体,我会让我的标准路由处理继续(例如,我的“错误”和“管理员”控制器,它们都是5个字符,但是不是短代码,将继续正常工作)。
TIA
答案 0 :(得分:0)
自定义路线可以完成这项工作:
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)
{
}