138

MVCフォームに2つのボタンがあります。

<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

コントローラのアクションから、どれが押されたかをどのように知ることができますか?

4

11 に答える 11

182

両方の送信ボタンに同じ名前を付けます

<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />

次に、コントローラーで送信の値を取得します。クリックされたボタンのみがその値を渡します。

public ActionResult Index(string submit)
{
    Response.Write(submit);
    return View();
}

もちろん、その値を評価して、スイッチブロックを使用してさまざまな操作を実行することもできます。

public ActionResult Index(string submit)
{
    switch (submit)
    {
        case "Save":
            // Do something
            break;
        case "Process":
            // Do something
            break;
        default:
            throw new Exception();
            break;
    }

    return View();
}
于 2009-11-11T10:26:39.390 に答える
51
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

そして、コントローラーのアクションでは:

public ActionResult SomeAction(string submit)
{
    if (!string.IsNullOrEmpty(submit))
    {
        // Save was pressed
    }
    else
    {
        // Process was pressed
    }
}
于 2009-11-11T09:23:36.657 に答える
36

これはより良い答えなので、ボタンのテキストと値の両方を持つことができます。

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

</p>
<button name="button" value="register">Register</button>
<button name="button" value="cancel">Cancel</button>
</p>

およびコントローラー:

public ActionResult Register(string button, string userName, string email, string password, string confirmPassword)
{
if (button == "cancel")
    return RedirectToAction("Index", "Home");
...

要するに、SUBMITボタンですが、name属性を使用して名前を選択します。これは、コントローラーメソッドパラメーターの名前submitまたはボタンに義務付けられていないため、さらに強力です。好きなように呼び出すことができます...

于 2013-01-07T11:14:46.847 に答える
22

あなたは以下のような名前タグからあなたのボタンを識別することができます、あなたはあなたのコントローラーでこのようにチェックする必要があります

if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}
于 2016-05-04T09:29:11.767 に答える
6

これは、カスタムMultiButtonAttributeを使用して、非常に簡単な手順でそれを行うための非常に素晴らしくシンプルな方法です。

http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx

要約すると、送信ボタンは次のようになります。

<input type="submit" value="Cancel" name="action" />
<input type="submit" value="Create" name="action" /> 

このようなあなたの行動:

[HttpPost]
[MultiButton(MatchFormKey="action", MatchFormValue="Cancel")]
public ActionResult Cancel()
{
    return Content("Cancel clicked");
}

[HttpPost]
[MultiButton(MatchFormKey = "action", MatchFormValue = "Create")]
public ActionResult Create(Person person)
{
    return Content("Create clicked");
} 

そして、このクラスを作成します。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultiButtonAttribute : ActionNameSelectorAttribute
{
    public string MatchFormKey { get; set; }
    public string MatchFormValue { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request[MatchFormKey] != null &&
            controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue;
    }
}
于 2013-01-31T12:23:44.543 に答える
3

簡単にするために、ボタンを次のように変更できます。

<input name="btnSubmit" type="submit" value="Save" />
<input name="btnProcess" type="submit" value="Process" />

あなたのコントローラー:

public ActionResult Create(string btnSubmit, string btnProcess)
{
    if(btnSubmit != null)
       // do something for the Button btnSubmit
    else 
       // do something for the Button btnProcess
}
于 2014-07-31T07:38:06.500 に答える
3
// Buttons
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

// Controller
[HttpPost]
public ActionResult index(FormCollection collection)
{
    string submitType = "unknown";

    if(collection["submit"] != null)
    {
        submitType = "submit";
    }
    else if (collection["process"] != null)
    {
        submitType = "process";
    }

} // End of the index method
于 2014-09-18T14:24:07.393 に答える
2

彼はずっと前に答え​​られたので、この投稿はCoppermillに答えるつもりはありません。私の投稿は、このような解決策を探している人に役立ちます。まず、「WDuffyのソリューションは完全に正しい」と言わなければなりませんが、それは正常に機能しますが、私のソリューション(実際には私のものではありません)は他の要素で使用され、プレゼンテーション層をコントローラーからより独立させます(コントローラーはボタンのラベルを表示するために使用される「値」。この機能は他の言語にとって重要です。)

これが私の解決策です、彼らに異なる名前を付けてください:

<input type="submit" name="buttonSave" value="Save"/>
<input type="submit" name="buttonProcess" value="Process"/>
<input type="submit" name="buttonCancel" value="Cancel"/>

また、以下のようなアクションでは、ボタンの名前を引数として指定する必要があります。

public ActionResult Register(string buttonSave, string buttonProcess, string buttonCancel)
{
    if (buttonSave!= null)
    {
        //save is pressed
    }
    if (buttonProcess!= null)
    {
        //Process is pressed
    }
    if (buttonCancel!= null)
    {
        //Cancel is pressed
    }
}

ユーザーがボタンの1つを使用してページを送信すると、引数の1つだけが値を持ちます。これは他の人にも役立つと思います。

アップデート

この答えはかなり古く、私は実際に私の意見を再考します。おそらく上記のソリューションは、モデルのプロパティにパラメータを渡す状況に適しています。気にせず、プロジェクトに最適なソリューションを採用してください。

于 2013-11-01T02:27:26.020 に答える
1

Request.Formコレクションを使用して見つけることができませんか?プロセスがクリックされた場合、request.form["process"]は空になりません

于 2009-11-11T09:24:12.943 に答える
0

両方のボタンに名前を付け、フォームから値を確認します。

<div>
   <input name="submitButton" type="submit" value="Register" />
</div>

<div>
   <input name="cancelButton" type="submit" value="Cancel" />
</div>

コントローラー側:

public ActionResult Save(FormCollection form)
{
 if (this.httpContext.Request.Form["cancelButton"] !=null)
 {
   // return to the action;
 }

else if(this.httpContext.Request.Form["submitButton"] !=null)
 {
   // save the oprtation and retrun to the action;
 }
}
于 2017-05-01T13:01:36.993 に答える
0

Core 2.2 Razorページでは、この構文は機能します。

    <button type="submit" name="Submit">Save</button>
    <button type="submit" name="Cancel">Cancel</button>
public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
        return Page();
    var sub = Request.Form["Submit"];
    var can = Request.Form["Cancel"];
    if (sub.Count > 0)
       {
       .......
于 2019-03-15T23:35:30.640 に答える