Val*_*sse 3 asp.net-mvc url-routing asp.net-mvc-routing value-provider
我遇到了一个我有默认MVC路由设置的场景.像所以.
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
然后导航到这样的URL
domain/controller/action/1234
Run Code Online (Sandbox Code Playgroud)
在这个页面上,我然后导航到同一页面,但在某个事件之后使用不同的参数.像这样.
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;
Run Code Online (Sandbox Code Playgroud)
我注意到url仍然在url中保持相同的id并附加参数.
domain/controller/action/1234?id=4321&vrnsearch=true
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,有没有办法确定优先权是否应该使用url或参数中的id值.
我实际上通过使用下面的方法找到了解决我的问题的方法,它从网址中删除了id并只使用了参数.
@Url.Action("action","controller", new {id = "", area = ""})
Run Code Online (Sandbox Code Playgroud)
但是,如果参数vs url路由中有优先权,那就太好奇了.
查询字符串与路由没有任何关系(至少,除非您自定义路由以考虑它).
传递给ModelBinder您的操作方法的值由Value Providers完成.您可以通过更改其对应ValueProviderFactory在静态ValueProviderFactories.Factories属性中注册的顺序来控制优先顺序.
正如您所看到的,默认配置是首先使用RouteDataValueProviderFactory,如果它没有返回值,它将尝试使用QueryStringValueProviderFactory.如果更改工厂的顺序,则优先顺序会更改.
ValueProviderFactories.Factories.RemoveAt(3);
ValueProviderFactories.Factories.Insert(4, new RouteDataValueProviderFactory());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |