2017-12-05 14 views
0

私は最近、私が作業する必要がある解決策があるので、この質問が出ました。提出時にmvcフォームコントローラを変更する

私はいくつかの方法で、いくつかのロジックを行う制御部を有する:

public Controller1: MvcController 
    { 
    public ActionResult SomeLogic(Model model) 
    { 
     return view(); 
    } 
    public ActionResult SomeLogic2(Model model) 
    { 
     return view(); 
    } 
    } 

私は異なる論理を行う第二のコントローラがあります

public Controller2: MvcController 
    { 
    public ActionResult SomeLogic(Model model) 
    { 
     return view(); 
    } 
    public ActionResult SomeLogic2(Model model) 
    { 
     return view(); 
    } 
    } 

両方が同じビューに取り組んでいました:

ビューには送信時に機能する開始フォームが含まれています。

@using(Html.BeginForm("SomeLogic", "Controller1", FormMethod.Post) 

と4つのボタンを提出:

<input type='submit' formaction='SomeLogic' value='submit' /> 
<input type='submit' formaction='SomeLogic2' value='submit2' /> 
<input type='submit' formaction='SomeLogic' value='submit3' /> 
<input type='submit' formaction='SomeLogic2' value='submit4' /> 

私は私が使用して提出リダイレクトしていますためのアクションを制御することができます知っている: formaction属性を。

私はコントローラを変更する方法もありますか?

<input type='submit' formaction='SomeLogic' value='submit3' /> 
<input type='submit' formaction='SomeLogic2' value='submit4' /> 

が私の始まりの形で定義されているcontroller2代わりのController1に提出されますことを意味しています。

新しいコントローラを作成するか、すでに複雑なロジックでいっぱいになっている既存のコントローラを使用するかは、私の議論を解決します。

+1

'formaction = "@のUrl.Action(" SomeLogicを使用して正しいコントローラに投稿できることを

注意"、" yourControllerName ")" ' –

答えて

1

formaction属性にコントローラ名を含める必要があります。お使いのコントローラ名が有効ではありませんが、あなたの

public FirstController: Controller 
{ 
    [HttpPost] 
    public ActionResult SomeLogic(Model model) 
    { 
     return view(); 
    } 
} 
public SecondController: Controller 
{ 
    [HttpPost] 
    public ActionResult SomeLogic(Model model) 
    { 
     return view(); 
    } 
} 

を持っていると仮定すると、あなたは

// Post to the SomeLogic method of FirstController 
<input type="submit" formaction="@Url.Action("SomeLogic", "First")" value="submit" /> 
// Post to the SomeLogic method of SecondController 
<input type="submit" formaction="@Url.Action("SomeLogic", "Second")" value="submit3" /> 
+0

シンプレックスのオブジェクトを渡すことはできますか? –

+0

もちろん、フォームコントロールの名前と値のペアはすべてサーバーメソッドに送信されます。 –

+0

優れています。以前はurl.actionに問題があったため、この質問をする必要がありました。クエリ文字列。私はクエリ文字列の私のURLをきれいにしておきたいと思っています。私はこれができるだけクリーンであることを確認しなければなりません。 –

1

jQueryの

に提出するだけでインターセプトあなたは、自分のフォームにIDを追加することができますjQueryの

@using(Html.BeginForm("SomeLogic", "Controller1", FormMethod.Post, new { @id = "yourForm" }) 
その後

$("#yourForm").submit(function(e){ 
    e.preventDefault(); 

    var url1 = '@(Url.Action("SomeLogic1", "SomeController", null, Request.Url.Scheme))'; 
    var url2 = '@(Url.Action("SomeLogic", "SomeController2", null, Request.Url.Scheme))'; 

    //Whatever logic should you do to select which URL you want to POST to 

    $.ajax({ 
     type: 'POST', 
     url: url_selected_above, 
     data: $('#yourForm').serializeArray(), 
     success: function (xhr, response) { 
      //... 
     }, 
     error: function (xhr, response) { 
      //... 
     } 
    }); 
}); 

これは動作するはずで簡単に選択できるように

すべてのメソッドが同じビューモデルを必要とする場合

また、UIで混乱させたくない場合は、フォームを生成するアクションで何かを行うことができます。

var controllerName = "SomeController"; 
var actionName = "Action1"; 

//do your logic to select whichever controller/action. 

viewModel.ControllerName = controllerName; 
viewModel.ActionName = actionName; 

とフォーム持つビューで:すべてのアクションが同じビューモデルを期待していた場合

再び
@using(Html.BeginForm(@Model.ActionName, @Model.ControllerName, FormMethod.Post) 

を、それが動作するはずです。

+0

質問は、どのような種類のクエリ文字列を作成する場合でも、私のURLにクエリ文字列を許可することはできません。 –

+1

@BarrJそうではありません。 'Url.Action'の 'null'パラメータはクエリパラメータのないURLを生成します。 –

+0

これは良いアプローチですが、私はむしろここでクライアントサイドを扱わないでしょう、私はすでにMvc Paged Listを使ってクライアントからのサブミットを使用しています。私はタグを制御し、それをすべてのページの送信ボタンとして使用しています。したがって、ロジックを混在させると状況が悪化します。 –

関連する問題