我有一个遗留网址,我希望将其映射到我的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"}
);
所以我的问题是查询字符串中的action
会被action
中的defaults
覆盖。有办法解决这个问题吗?
答案 0 :(得分:4)
controller
,action
和area
是asp.net MVC中唯一的保留字。 “保留”意味着MVC赋予它们特殊的含义,特别是对于路由。
还有其他字词(COM1-9
,LPT1-9
,AUX
,PRT
,NUL
,CON
),并非特定于asp .net,比不能在网址中。这解释了为什么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;
}
答案 1 :(得分: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");
}