ASP.Net MVC3:设置路由来处理多个唯一ID?

时间:2011-09-29 16:34:04

标签: asp.net asp.net-mvc-3 routes controllers

我正在构建一个MVC应用程序,该应用程序由两个不同的唯一ID引用的实体组成,一个丑陋的系统生成的ID,以及一个用户友好的5个字符“短代码”。例如,我希望我的最终用户能够在他们的浏览器中输入以下网址:

http://intranet/PRJ2011004

http://intranet/DEP42

同样,这两个代码都是唯一的。我有正确设置第一个URL的路由。当用户输入该URL时,他们会收到显示实体索引页的正确页面:PRJ201104。

如何设置处理第二种情况的路线?优选地,存在一种“欺骗”MVC以将其从短代码传递到控制器的值改变为项目的方法。

我想拦截5字符短代码路径,获取提供的值并在我的实体表中查找,然后如果我找到匹配的记录,我想要(按优先顺序):< / p>

  1. 显示实体的索引页面,同时仍保留网址中的短代码。在这种情况下,我想“欺骗”处理路由的控制器认为传入的“id”实际上是唯一的ID而不是短代码(为了不必重构我现有的代码)
  2. 将网址重定向到具有工作唯一(丑陋)ID的网址。
  3. 如果我找不到使用该短代码值的匹配实体,我会让我的标准路由处理继续(例如,我的“错误”和“管理员”控制器,它们都是5个字符,但是不是短代码,将继续正常工作)。

    TIA

1 个答案:

答案 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)
{

}