MVCフォームに2つのボタンがあります。
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
コントローラのアクションから、どれが押されたかをどのように知ることができますか?
MVCフォームに2つのボタンがあります。
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />
コントローラのアクションから、どれが押されたかをどのように知ることができますか?
両方の送信ボタンに同じ名前を付けます
<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();
}
<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
}
}
これはより良い答えなので、ボタンのテキストと値の両方を持つことができます。
</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またはボタンに義務付けられていないため、さらに強力です。好きなように呼び出すことができます...
あなたは以下のような名前タグからあなたのボタンを識別することができます、あなたはあなたのコントローラーでこのようにチェックする必要があります
if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}
これは、カスタムMultiButtonAttributeを使用して、非常に簡単な手順でそれを行うための非常に素晴らしくシンプルな方法です。
要約すると、送信ボタンは次のようになります。
<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;
}
}
簡単にするために、ボタンを次のように変更できます。
<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
}
// 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
彼はずっと前に答えられたので、この投稿は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つだけが値を持ちます。これは他の人にも役立つと思います。
アップデート
この答えはかなり古く、私は実際に私の意見を再考します。おそらく上記のソリューションは、モデルのプロパティにパラメータを渡す状況に適しています。気にせず、プロジェクトに最適なソリューションを採用してください。
Request.Formコレクションを使用して見つけることができませんか?プロセスがクリックされた場合、request.form["process"]は空になりません
両方のボタンに名前を付け、フォームから値を確認します。
<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;
}
}
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)
{
.......