私は得ることができない @Url.Action
適用した属性ルートに基づいて期待するURLに解決するには:
私のアクション(SearchController、ただし[RoutePrefix( "add")])
[Route("{searchTerm}/page/{page?}", Name = "NamedSearch")]
[Route("~/add")]
public ActionResult Index(string searchTerm = "", int page = 1)
{
...
}
RLアクションの呼び出し
@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1 })
これにより、URLは
/add?searchTerm=replaceMe&page=1
私は期待します
/add/replaceMe/page/1
URLを手動で入力すると、正しいパラメーターを使用して正しいアクションに解決されます。なぜ@Url.Action
正しいURLを解決しますか?
きれいなルート定義の名前があるので、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
}
ルートは順序に依存します。ただし、属性はそうではありません。実際、このような単一のアクションで2つのRoute
属性を使用すると、Reflectionはカスタム属性を分析するときに順序を保証しないため、一部のコンパイルでは機能し、他のコンパイルでは機能しない場合があります。
ルートが正しい順序でルートテーブルに入力されるようにするには、各属性に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"
完全なURLを返すには、これを使用します
@Url.Action("Index", new { controller = "Search", searchTerm = "replaceMe", page = 1}, protocol: Request.Url.Scheme)
// Returns "http://yourdomain.com/add/replaceMe/page/1"
これが誰かを助けることを願っています。