web-dev-qa-db-ja.com

複数の異なる送信ボタンを持つMVCカミソリフォーム?

Razorビューには、フォーム内に3つのボタンがあります。ボタンのすべてのアクションには、基本的に入力フィールドに入力される値であるフォーム値が必要です。

ボタンをクリックするたびに、デフォルトのアクションにリダイレクトされました。ボタンを押すことに基づいてさまざまなアクションにフォームを送信する方法を教えてください。

あなたの時間、指導、助けに本当に感謝しています。

56
Toubi

これを試すこともできます:

<input type="submit" name="submitbutton1" value="submit1" />
<input type="submit" name="submitbutton2" value="submit2" />

次に、デフォルトの関数で、必要な関数を呼び出します。

if( Request.Form["submitbutton1"] != null)
{
    // Code for function 1
}
else if(Request.Form["submitButton2"] != null )
{
    // code for function 2
}
87

このエレガントなソリューションは、多数の送信ボタンで機能します。

@Html.Begin()
{
  // Html code here
  <input type="submit" name="command" value="submit1" />
  <input type="submit" name="command" value="submit2" />

}

そして、コントローラーのアクションメソッドでパラメーターとして受け入れます。

public ActionResult Create(Employee model, string command)
{
    if(command.Equals("submit1"))
    {
      // Call action here...
    }
    else
    {
      // Call another action here...
    }
}
71
Priyank Sheth

ビューで

<form action="/Controller_name/action" method="Post>

 <input type="submit" name="btn1" value="Ok" />
 <input type="submit" name="btn1" value="cancel" />
 <input type="submit" name="btn1" value="Save" />
</form>

アクションで

string str =Request.Params["btn1"];
if(str=="ok"){


}
if(str=="cancel"){


}
if(str=="save"){


}
16
Lamloumi Afif

JS + Ajaxを使用できます。たとえば、ボタンがある場合は、クリックイベントで実行する必要があることを伝えることができます。ここにコード:

 <input id="btnFilterData" type="button" value="myBtn">

ここで、HTMLのボタン:スクリプトセクションで、このコードを使用する必要があります(このセクションはドキュメントの最後にあります)。

<script type="text/javascript">
$('#btnFilterData').click(function () {
    myFunc();
});
</script>

最後に、ajax関数を追加する必要があります(別のスクリプトセクションで、ドキュメントの冒頭に配置する必要があります)。

function myFunc() {
    $.ajax({
        type: "GET",
        contentType: "application/json",
        url: "/myController/myFuncOnController",
        data: {
             //params, which you can pass to yu func
        },
        success: function(result) {

        error: function (errorData) {

        }
    });
};
10
Arthur

私が見つけた最もクリーンなソリューションは次のとおりです。

この例では、2つのまったく異なるアクションを実行します。基本的な前提は、値を使用してデータをアクションに渡すことです。

あなたの見解では:

@using (Html.BeginForm("DliAction", "Dli", FormMethod.Post, new { id = "mainForm" }))
{
    if (isOnDli)
    {
        <button name="removeDli" value="@result.WeNo">Remove From DLI</button>
    }
    else
    {
        <button name="performDli" value="@result.WeNo">Perform DLI</button>
    }
}

その後、あなたの行動で:

    public ActionResult DliAction(string removeDli, string performDli)
    {
        if (string.IsNullOrEmpty(performDli))
        {
            ...
        }
        else if (string.IsNullOrEmpty(removeDli))
        {
            ...
        }

        return View();
    }

このコードは、テーマに沿ったバリエーションを実現するために簡単に変更できる必要があります。ボタンの名前を同じ名前に変更すると、次に示すように、アクションなどのパラメーターが1つだけ必要になります。

あなたの見解では:

@using (Html.BeginForm("DliAction", "Dli", FormMethod.Post, new { id = "mainForm" }))
{

        <button name="weNo" value="@result.WeNo">Process This WeNo</button>

        <button name="weNo" value="@result.WeNo">Process A Different WeNo This Item</button>
}

その後、あなたの行動で:

    public ActionResult DliAction(string weNo)
    {
        // Process the weNo...

        return View();
    }
4
Paul Zahra

ビュー内の各ボタンを独自のフォームでラップしてみてください。

  @using (Html.BeginForm("Action1", "Controller"))
  {
    <input type="submit" value="Button 1" />
  }

  @using (Html.BeginForm("Action2", "Controller"))
  {
    <input type="submit" value="Button 2" />
  }
3
TK-421

通常のボタン(送信しない)を使用できます。 javascriptを使用して(「onclick」イベントで)フォームの「action」属性を必要なものに書き換えて送信します。カスタムヘルパーを使用してボタンを生成します(プロジェクトのルートにあるApp_Codeフォルダー内に「Helper.cshtml」ファイルを作成します)。

@helper SubmitButton(string text, string controller,string action)
{   
    var uh = new System.Web.Mvc.UrlHelper(Context.Request.RequestContext);
    string url = @uh.Action(action, controller, null);   
    <input type=button  onclick="(
                                       function(e)
                                                 {
                                                   $(e).parent().attr('action', '@url'); //rewrite action url
                                                   //create a submit button to be clicked and removed, so that onsubmit is triggered
                                                   var form = document.getElementById($(e).parent().attr('id'));
                                                   var button = form.ownerDocument.createElement('input');
                                                   button.style.display = 'none';
                                                   button.type = 'submit';
                                                   form.appendChild(button).click(); 
                                                   form.removeChild(button);              
                                                  }
                                      )(this)" value="@text"/>
}

そして、次のように使用します:

@Helpers.SubmitButton("Text for 1st button","ControllerForButton1","ActionForButton1")
@Helpers.SubmitButton("Text for 2nd button","ControllerForButton2","ActionForButton2")
...

フォーム内。

3
galmeida

これは私のために働いたものです。

formaction="@Url.Action("Edit")"

スニペット:

 <input type="submit" formaction="@Url.Action("Edit")" formmethod="post" value="Save" class="btn btn-primary" />

<input type="submit" formaction="@Url.Action("PartialEdit")" formmethod="post" value="Select Type" class="btn btn-primary" />

 [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit( Quote quote)
        {
           //code 
       }
 [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult PartialEdit(Quote quote)
        {
           //code
        }

セレクターを使用したり、クライアントスクリプトを使用したりする1つのメソッドではなく、2つの異なるアクションメソッドを使用したい人を助けるかもしれません。

1
user2695433

最も簡単な方法は、html5 FormActionおよびFormMethodを使用することです

<input type="submit" 
           formaction="Save"
           formmethod="post" 
           value="Save" />
    <input type="submit"
           formaction="SaveForLatter"
           formmethod="post" 
           value="Save For Latter" />
    <input type="submit"
           formaction="SaveAndPublish"
           formmethod="post"
           value="Save And Publish" />

[HttpPost]
public ActionResult Save(CustomerViewModel model) {...}

[HttpPost]
public ActionResult SaveForLatter(CustomerViewModel model){...}

[HttpPost]
public ActionResult SaveAndPublish(CustomerViewModel model){...}

使用できる方法は他にもたくさんあります。この記事を参照してください ASP.Net MVCの複数の送信ボタンをさまざまな方法で使用

1
Ali Adravi

純粋なカミソリを使用している場合、つまりMVCコントローラーがない場合:

<button name="SubmitForm" value="Hello">Hello</button>
<button name="SubmitForm" value="World">World</button>
@if (IsPost)
{
    <p>@Request.Form["SubmitForm"]</p>
}

各ボタンをクリックすると、HelloとWorldが表示されます。

0
Jacques

タグヘルパー(コアMVC)を使用して回答が表示されなかったため、ここで(削除アクションの場合)に進みます。

HTMLの場合:

<form action="" method="post" role="form">
<table>
@for (var i = 0; i < Model.List.Count(); i++)
{
    <tr>
        <td>@Model.List[i].ItemDescription</td>
        <td>
            <input type="submit" value="REMOVE" class="btn btn-xs btn-danger" 
             asp-controller="ControllerName" asp-action="delete" asp-route-idForDeleteItem="@Model.List[i].idForDeleteItem" />
        </td>
    </tr>
}
</table>
</form>

コントローラー上:

[HttpPost("[action]/{idForDeleteItem}"), ActionName("Delete")]
public async Task<IActionResult> DeleteConfirmed(long idForDeleteItem)
{
    ///delete with param id goes here
}

クラス宣言の前に-コントローラーで[Route("[controller]")]を使用することを忘れないでください。

0
Pablo

この回答では、カミソリを使用してasp.netで作業する方法、および複数の送信ボタンイベントを制御する方法を示します。たとえば、2つのボタンがあるとします。1つは「PageA.cshtml」にリダイレクトし、もう1つは「PageB.cshtml」にリダイレクトします。

@{
  if (IsPost)
    {
       if(Request["btn"].Equals("button_A"))
        {
          Response.Redirect("PageA.cshtml");
        }
      if(Request[&quot;btn"].Equals("button_B"))
        {
          Response.Redirect(&quot;PageB.cshtml&quot;);
        }
  }
}
<form method="post">
   <input type="submit" value="button_A" name="btn"/>;
   <input type="submit" value="button_B" name="btn"/>;          
</form>
0
Pir Fahim Shah