web-dev-qa-db-ja.com

Url.Actionを使用したMVC属性ルーティングがルートを解決しない

私は得ることができない @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を解決しますか?

14
Simon

きれいなルート定義の名前があるので、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
}
16
Shyju

ルートは順序に依存します。ただし、属性はそうではありません。実際、このような単一のアクションで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"
4
NightOwl888

完全なURLを返すには、これを使用します

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

// Returns "http://yourdomain.com/add/replaceMe/page/1"

これが誰かを助けることを願っています。

0
Ram Pratap