Asp.net-Mvc

帶有 Url.Action 的 MVC 屬性路由未解析路由

  • February 7, 2018

根據我應用的屬性路由,我無法@Url.Action解析到我期望的 url:

我的行動(SearchController 但與$$ RoutePrefix(“add”) $$)

    [Route("{searchTerm}/page/{page?}", Name = "NamedSearch")]
    [Route("~/add")]
    public ActionResult Index(string searchTerm = "", int page = 1)
    {
      ...
    }

呼叫 Url.Action

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })

這會產生一個 url

/add?searchTerm=replaceMe&page=1

我希望

/add/replaceMe/page/1

如果我手動輸入 url,那麼它會解析為具有正確參數的正確操作。為什麼不@Url.Action解析正確的網址?

由於您為漂亮的路線定義命名,您可以使用該RouteUrl方法。

@Url.RouteUrl("NamedSearch", new {  searchTerm = "replaceMe", page = 1})

由於您需要添加 url,因此您應該更新您的路由定義以將其包含在 url 模式中。

[Route("~/add")]
[Route("~/add/{searchTerm?}/page/{page?}", Name = "NamedSearch")]
public ActionResult Index(string searchTerm = "", int page = 1)
{
// to do : return something
}

路線是順序敏感的。但是,屬性不是。事實上,當Route像這樣在單個操作上使用 2 個屬性時,您可能會發現它適用於某些編譯而不適用於其他編譯,因為反射在分析自定義屬性時不保證順序。

為了確保您的路由以正確的順序輸入到路由表中,您需要將Order屬性添加到每個屬性。

[Route("{searchTerm}/page/{page?}", Name = "NamedSearch", Order = 1)]
[Route("~/add", Order = 2)]
public ActionResult Index(string searchTerm = "", int page = 1)
{
   return View();
}

解決排序問題後,URL 會以您期望的方式解析。

@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })

// Returns "/add/replaceMe/page/1"

引用自:https://stackoverflow.com/questions/36270852