2016-09-05 12 views
1

私はルート/Account/UserProfile/{username}にナビゲートしようとしていますが、ルートを正しく設定したかどうかはわかりません。または、むしろ、私はこのルートを動作させるためにルートテーブルに何を追加するか分からない。リクエストURLの名前付きパラメータを使用したルーティング

ここでアクションメソッドです:

public IActionResult UserProfile(string username) 
{ 
    // Do something 
} 

私が正しく打ってるシンプルなGETメソッドです。私の問題は、/Account/UserProfile/MyUsernameのようにURLに文字列を指定しても、文字列MyUsernameが私のコントローラに送信されていないことです。

アプリケーションの作成時に標準ルートのみが既に追加されています。これらのルートを有効にするには何を追加する必要がありますか?

app.UseMvc(routes => 
{ 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 
}); 
+0

ルートに 'username'パラメータがありません。パラメータ名は一致する必要があります – Nkosi

+0

@Nkosiこういうルートなので、 'routes.MapRoute(name: 'default2'、テンプレート: '{controller = Account}/{action = UserProfile}/{username}');'? – Detilium

+0

CodeCasterの答えを確認してください。それはより詳細です。 – Nkosi

答えて

2

ルートにusernameパラメータがありません。パラメータ名が一致する必要があります

app.UseMvc(routes => { 
    routes.MapRoute(
     name: "UserProfile", 
     template: "Account/UserProfile/{username}", 
     defaults: { controller = "Account", action = "UserProfile" }); 

    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 
}); 
+0

完璧に動作します。ありがとうございました。 – Detilium

2

値は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

+0

同様に動作します。ありがとう! – Detilium

関連する問題