【问题标题】:Routing Reserved Words in ASP.Net在 ASP.Net 中路由保留字
【发布时间】:2013-07-16 06:11:01
【问题描述】:

我有一个旧网址,我希望将其映射到我的 ASP.Net MVC 应用程序中的路由

e.g. http://my.domain.com/article/?action=detail&item=22

现在在创建路由时action 有特殊含义所以我要创建这个路由?控制器是 RedirectController,动作是 Item。

routes.MapRoute(
            name: "Redirect",
            url: "article",
            defaults:new { controller = "redirect", action = "item"}
            );

所以我的问题是查询字符串中的actiondefaults 中的action 覆盖。有没有办法解决这个问题?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


    【解决方案1】:

    controller,actionarea 是 asp.net MVC 中唯一的保留字。 “保留”意味着 MVC 赋予它们特殊的含义,尤其是对于路由。

    还有其他词(COM1-9LPT1-9AUXPRTNULCON),不是asp.net特有的,不能在url中。这解释了为什么here 以及如何绕过here

    编辑: 没有办法使用它们,因为 asp.net mvc 在路由数据中依赖它们。

    这是一个取自 UrlHelper 的反编译示例:

    // System.Web.Mvc.RouteValuesHelpers
    public static RouteValueDictionary MergeRouteValues(string actionName, string controllerName, RouteValueDictionary implicitRouteValues, RouteValueDictionary routeValues, bool includeImplicitMvcValues)
    {
        RouteValueDictionary routeValueDictionary = new RouteValueDictionary();
        if (includeImplicitMvcValues)
        {
            object value;
            if (implicitRouteValues != null && implicitRouteValues.TryGetValue("action", out value))
            {
                routeValueDictionary["action"] = value;
            }
            if (implicitRouteValues != null && implicitRouteValues.TryGetValue("controller", out value))
            {
                routeValueDictionary["controller"] = value;
            }
        }
        if (routeValues != null)
        {
            foreach (KeyValuePair<string, object> current in RouteValuesHelpers.GetRouteValues(routeValues))
            {
                routeValueDictionary[current.Key] = current.Value;
            }
        }
        if (actionName != null)
        {
            routeValueDictionary["action"] = actionName;
        }
        if (controllerName != null)
        {
            routeValueDictionary["controller"] = controllerName;
        }
        return routeValueDictionary;
    }
    

    【讨论】:

    • 我理解为保留字。我要问的是我可以绕过它吗?
    【解决方案2】:

    我已经设法使用自定义 ModelBinder 破解它。我创建了一个名为QueryString的基本类

        public class QueryString
        {
                private readonly IDictionary<string,string> _pairs;
    
                public QueryString()
                {
                        _pairs = new Dictionary<string, string>();
                }
    
                public void Add(string key, string value)
                {
                        _pairs.Add(key.ToUpper(), value);
                }
    
                public string Get(string key)
                {
                        return _pairs[key.ToUpper()];
                }
    
                public bool Contains(string key)
                {
                        return _pairs.ContainsKey(key.ToUpper());
                }
        }
    

    然后我为此创建自定义活页夹:-

        public class QueryStringModelBinder : IModelBinder
        {
                public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
                {
                        var queryString = new QueryString();
                        var keys = controllerContext.HttpContext.Request.QueryString.AllKeys;
    
                        foreach (var key in keys)
                        {
                                queryString.Add(key, controllerContext.HttpContext.Request.QueryString[key]);
                        }
    
                        return queryString;
                }
        }
    

    在我的 Global.asax 中注册它:-

    ModelBinders.Binders.Add(typeof(QueryString), new QueryStringModelBinder());
    

    现在我可以在我的 RedirectController 中使用它:-

    public RedirectToRouteResult Item(QueryString queryString)
    {
        // user QueryString object to get what I need
        // e.g. queryString.Get("action");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 2015-09-22
      • 2017-07-04
      • 2010-11-08
      • 1970-01-01
      相关资源
      最近更新 更多