MVC 路由参数优先级
MVC Routing Parameter Precedence
我遇到了一个场景,其中我有默认的 MVC 路由设置。像这样。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
然后导航到 url 这样的
domain/controller/action/1234
在这个页面上,我在某个事件后导航到同一页面但参数不同。像这样。
var id = $(this).data("id");
var url = "@Url.Action("action", "controller", new { area = ""})";
var params = $.param({id: id, vrnsearch: true});
var fullUrl = url += "?" + params;
window.location.href = fullUrl;
我注意到 url 仍然在 url 中保持相同的 ID 并像这样附加参数。
domain/controller/action/1234?id=4321&vrnsearch=true
现在我的问题是,是否有一种方法可以确定它是否应该使用来自 url 或来自参数的 id 值的优先级。
我实际上找到了一个工作 around/fix 通过使用下面的方法来解决我的问题,它从 url 中删除了 id 并且只使用参数。
@Url.Action("action","controller", new {id = "", area = ""})
但是只是好奇参数与 url 路由是否有优先级。
查询字符串与路由完全无关(至少,除非您自定义路由以考虑它)。
传递给 ModelBinder
和您的操作方法的值由 Value Providers 完成。您可以通过更改其对应的 ValueProviderFactory
在静态 ValueProviderFactories.Factories
属性.
中注册的顺序来控制优先顺序
如您所见,默认配置是首先使用 RouteDataValueProviderFactory
,如果 returns 没有值,它将尝试 QueryStringValueProviderFactory
。如果更改工厂的顺序,优先顺序也会更改。
ValueProviderFactories.Factories.RemoveAt(3);
ValueProviderFactories.Factories.Insert(4, new RouteDataValueProviderFactory());
我遇到了一个场景,其中我有默认的 MVC 路由设置。像这样。
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
然后导航到 url 这样的
domain/controller/action/1234
在这个页面上,我在某个事件后导航到同一页面但参数不同。像这样。
var id = $(this).data("id");
var url = "@Url.Action("action", "controller", new { area = ""})";
var params = $.param({id: id, vrnsearch: true});
var fullUrl = url += "?" + params;
window.location.href = fullUrl;
我注意到 url 仍然在 url 中保持相同的 ID 并像这样附加参数。
domain/controller/action/1234?id=4321&vrnsearch=true
现在我的问题是,是否有一种方法可以确定它是否应该使用来自 url 或来自参数的 id 值的优先级。
我实际上找到了一个工作 around/fix 通过使用下面的方法来解决我的问题,它从 url 中删除了 id 并且只使用参数。
@Url.Action("action","controller", new {id = "", area = ""})
但是只是好奇参数与 url 路由是否有优先级。
查询字符串与路由完全无关(至少,除非您自定义路由以考虑它)。
传递给 ModelBinder
和您的操作方法的值由 Value Providers 完成。您可以通过更改其对应的 ValueProviderFactory
在静态 ValueProviderFactories.Factories
属性.
如您所见,默认配置是首先使用 RouteDataValueProviderFactory
,如果 returns 没有值,它将尝试 QueryStringValueProviderFactory
。如果更改工厂的顺序,优先顺序也会更改。
ValueProviderFactories.Factories.RemoveAt(3);
ValueProviderFactories.Factories.Insert(4, new RouteDataValueProviderFactory());