【问题标题】:MVC Routing Parameter PrecedenceMVC 路由参数优先级
【发布时间】:2016-08-04 19:05:15
【问题描述】:

我遇到了一个使用默认 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;

我注意到 url 仍然在 url 中保持相同的 id 并附加类似的参数。

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

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

我实际上已经找到了解决/修复我的问题的方法,方法是使用以下方法从 url 中删除 id 并仅使用参数。

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

但是只是好奇参数与 url 路由是否有优先级。

【问题讨论】:

    标签: asp.net-mvc url-routing asp.net-mvc-routing value-provider


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多