MVC路由参数优先级

时间:2016-04-13 15:07:44

标签: 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 }
    );

然后导航到这样的网址

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;

我注意到网址仍然在网址中保留了相同的ID,并附加了这样的参数。

domain/controller/action/1234?id=4321&vrnsearch=true

现在我的问题是,有没有办法确定优先权是否应该使用url或参数中的id值。

我实际上通过使用下面的方法找到了解决我的问题的方法,它会从网址中删除id并只使用参数。

@Url.Action("action","controller", new {id = "", area = ""})

然而,如果参数vs url routing有优先权,那就太好了。

1 个答案:

答案 0 :(得分:6)

查询字符串与路由没有任何关系(至少,除非您自定义路由以考虑它)。

传递给ModelBinder和您的操作方法的值由值提供程序完成。您可以通过更改在静态ValueProviderFactory属性中注册其对应ValueProviderFactories.Factories的顺序来控制优先顺序。

enter image description here

如您所见,默认配置是首先使用RouteDataValueProviderFactory,如果没有返回任何值,它将尝试QueryStringValueProviderFactory。如果更改工厂的顺序,则优先顺序会更改。

ValueProviderFactories.Factories.RemoveAt(3);
ValueProviderFactories.Factories.Insert(4, new RouteDataValueProviderFactory());