2016-11-22 8 views
2

で三番目のパラメータを取得し、私はこのURLを持っている:私はasp.net MVCのウェブサイトを持ってasp.net MVC

Home/Index/ 

あり、私がやりたいワンアクションであり、現在、私はそれをやっていますクエリ文字列を使用して、次のように:

Home/Index/?action=1 

私は、Request.QueryString["action"]を使用して私のコードでそれを取得します。

しかし、これはそれが必要のように良い見ていない、私はこのような何かを持っているしたいと思います:

Home/Index/Action 

だから、クエリ文字列は、第三引数になります。このように使用して、3番目のパラメータが存在し、それが名前であるかどうかを確認するにはどうすればよいですか?

私のルートは、このように構成されています

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

私はルート上で何かを変更する必要があるか、私はちょうど私が望むように入力することができ、そうであれば、どのように私は、この値を取得しますか?


編集:

よし。私がしたかったのは、このパラメータに応じて、ビュー内に別の結果を表示することでした。

私が今行ったのは、同じビューがViewDataに異なる値を送信する2つのActionResultsを作成することでした。

+0

私はasp.net web api 2でルーティング属性を使用することでそれを達成できると思います。https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing -in-web-api-2とここでは、mvc属性ルーティングの詳細があります。https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/ – Vinod

答えて

4

MVCにはModel Bindingの概念があり、パラメータの名前が使用され、フォームの値が入力される必要はありません。

あなたはこのようなあなたのアクションメソッドを記述する場合:

public ActionResult Index(int action) 
{ ... } 

それはすでに/Home/Index?action=1のために動作します。

あなたは/Home/Index/1のようにそれを呼び出すことができるようにしたい場合は、最も簡単な方法は、単にこのような対処方法を記述することです:

public ActionResult Index(int id) 
{ ... } 

後に何かがある場合MapRoute定義は基本的に」と言うので、これは動作します{id}パラメータに{Action}メソッドの{id}パラメータをバインドします。


更新
両方呼び出しシナリオactionと呼ばれるパラメータを使用しての問題は、{action}はMVCで特別なキーワードであるということです。両方の呼び出しシナリオにMySpecialParamを使用するには
、あなたはこのルートを追加することができます。

routes.MapRoute(
    name: "Default_MySpecialParam", 
    url: "{controller}/{action}/{MySpecialParam}", 
    defaults: new { controller = "Home", action = "Index", MySpecialParam = UrlParameter.Optional } 
); 

しかしMySpecialParamactionになるとしたら、その後、MVCはおそらく知ることができません名前解決の競合がありますどのように処理するか、エラーを投げるかもしれません。

+0

このコメントを確認するhttp://stackoverflow.com/questions/40741029/get-third-parameter-in-asp-net-mvc#comment68708248_40741205 – Phiter

+0

更新を見る... –

0

アクションはコントローラの直後にあるはずです。私はあなたのケースでは、あなたが望むアクションを持っている新しいコントローラを追加する方が良いかもしれないと思います。

+0

事は、私は同じビューを使用する必要があります。同様のデータを渡しながら、同じビューを使用する2つのアクションがあると、より良いと思いますか? – Phiter

0

これは面倒なので、私はマッピングルートを断念しました。

routes.MapRoute(
     "ThreeIds",         // Route name 
     "{controller}/{action}/{firstId}/{secondId}/{thirdId}" // URL with parameters 

     ); 

routes.MapRoute(
     "Dates",        // Route name 
     "{controller}/{action}/{startDate}/{endDate}"  // URL with parameters 

     ); 

代わりにjQueryのような方法でajax呼び出しを実行してみてください。すべての可能性のためのルートを追加するためのneadはありません。

$.ajax({ 
      url: '../' + controller + '/' + method, 
      data: jsonObjectString, 
      contentType: 'application/json', 
      dataType: 'json',    
      success: function (data) { 
       //do something 
      }, 
      error: function (err) { 
       //do something 
      } 
     }); 

私のライブラリhttps://github.com/Biot-Savart/MVC-DataCall.jsで私のライブラリを使うことができます。

関連する問題