Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.Net MVC3:设置路由以处理多个唯一ID';s_Asp.net_Asp.net Mvc 3_Routes_Controllers - Fatal编程技术网

ASP.Net MVC3:设置路由以处理多个唯一ID';s

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

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

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

如何设置路线以处理第二种情况?最好有一种方法可以“欺骗”MVC,使其将传递给控制器的值从短代码更改为项目

我想要一种截取5个字符的短代码路由的方法,获取提供的值并在我的entities表中查找它,然后如果我找到匹配的记录,我想要(按照优先顺序):

  • 显示实体的索引页,同时在url中保留短代码。在这个场景中,我想“欺骗”处理路由的控制器,使其认为传入的“id”实际上是唯一的id,而不是短代码(以便不必重构现有代码)
  • 将url重新定向到具有唯一(丑陋)ID的url
  • 如果我没有找到使用该短代码值的匹配实体,我会让我的标准路由处理继续(例如,我的“Error”和“Admin”控制器,它们都是5个字符,但不是短代码,将继续正常工作)


    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())