3

我遇到了我有默認的MVC路由設置的場景。像這樣。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仍然保持相同的ID在URL和附加參數像這樣。現在

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

我的問題是,有沒有辦法來確定優先是否應該從URL或從參數使用值ID。

我實際上已經找到了一個解決我的問題的方法,通過使用下面的代碼,它從url中刪除了id,並使用參數。

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

但是,只是好奇,如果在參數與網址路由優先。

回答

5

查詢字符串與路由沒有任何關係(至少,除非您自定義路由以考慮它)。

傳遞給ModelBinder和您的操作方法的值由價值提供商完成。您可以通過更改其相應的ValueProviderFactory在靜態ValueProviderFactories.Factories屬性中註冊的順序來控制優先順序。

enter image description here

正如你可以看到,默認配置是第一次使用RouteDataValueProviderFactory,如果它沒有返回值,它將嘗試QueryStringValueProviderFactory。如果您更改工廠的順序,則優先順序會改變。

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