値はusername
キーの下RouteDataになりますが、キーはそのパラメータ名を含む知らルート値ではありませんので、それは、自動的にusername
という名前のパラメータにマッピングされることはありません。
は、あなただけの、この方法のためにルートを作成することができます。
routes.MapRoute(
name: "userProfileByUsername",
template: "Account/UserProfile/{username}"),
defaults: new { controller = "Account", action = "UserProfile" });
しかし、それはすべてのアクションメソッドのルートを作成する必要になると、それは、ナンセンスだろう。単一のルートに対する複数の使用のパターンが出現すると、同じ属性を複数回宣言する必要がなくなるので、このようなルートを作成するのに恩恵を受けることになります。例えば
使用すると、1つのコントローラで複数のアクションメソッド宣言したいとき:
/Account/UserProfile/{username}
/Account/View/{username}
/Account/Foo/{username}
/Account/Bar/{username}
を、作成するために、スマートになります代わりに新しいルート:
routes.MapRoute(
name: "accountActionByUsername",
template: "Account/{action}/{username}"),
defaults: new { controller = "Account" });
ワンオフケースでは
、またはパターンは、アクションメソッドごとに異なる場合、あなたはオプトインするために、特定のルートにルーティング属性を使用することができます。
[HttpGet("[action]/{username}"]
public IActionResult UserProfile(string username)
はnew [action]
placeholderの使用に注意してください、文字列にアクション名を付ける必要はありません。
それともaccessing the raw route dataで値を見つけることができますが、あなたが本当にすべきでない:
最後に
public IActionResult UserProfile()
{
string username = ViewContext.RouteData.Values["username"];
// ...
}
ユーザー名は、クエリ文字列パラメータも持っていることを選ぶことができます:
public IActionResult UserProfile([FromQuery]string username)
作りますリクエストURL /Account/UserProfile?username=MyUsername
。
ルートに 'username'パラメータがありません。パラメータ名は一致する必要があります – Nkosi
@Nkosiこういうルートなので、 'routes.MapRoute(name: 'default2'、テンプレート: '{controller = Account}/{action = UserProfile}/{username}');'? – Detilium
CodeCasterの答えを確認してください。それはより詳細です。 – Nkosi