有時我們需要在同一個Form表單中進行多個按鈕的提交,來完成不同的功能。因為MVC中一個表單默認只能提交到一個Action處理,相對比較麻煩。
1、使用客戶端腳本
我們可以view中加上如下代碼:
<input type="submit" value="SubmitToAbout1" onclick='this.form.action="@Url.Action("About1")" '/> <br /> <input type="submit" value="SubmitToAbout2" onclick='this.form.action="@Url.Action("About2")" '/>
用來指示不同的按鈕點擊后跳轉到不同的Action。Action方法代碼如下:
public string About1(FormCollection collection) { return collection["Title"]; } public string About2(FormCollection collection) { return collection["Title"]; }
這樣就實現了點擊不同的按鈕跳轉到不同的方法中。
2、在Action中判斷按鈕的value值
在view中,不同的input標簽,定義相同的name,如下:
<input type="submit" value="SubmitToAbout1" name="action"/> <input type="submit" value="SubmitToAbout2" name="action"/>
然后在Action方法中,獲取表單傳過來的數據,獲取name為action的value值,再根據value值去進行判斷。
[HttpPost] public ActionResult About(FormCollection collection) { string action=collection["action"]; if (action == "SubmitToAbout1") { ViewBag.action = "SubmitToAbout1"; } else if (action == "SubmitToAbout2") { ViewBag.action = "SubmitToAbout2"; } return View(); }
此種方法我們可以做出改進,新建一個MultiButtonAttribute類,該類繼承ActionNameSelectorAttribute類,該類代碼如下:
[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, System.Reflection.MethodInfo methodInfo) { bool state= controllerContext.HttpContext.Request[MatchFormKey] != null && controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue; return state; } }
其中view中代碼不變,還是
<input type="submit" value="SubmitToAbout1" name="action"/> <input type="submit" value="SubmitToAbout2" name="action"/>
在控制器的Action中調用:
[HttpPost] [MultiButton(MatchFormKey = "action", MatchFormValue = "SubmitToAbout1")] public string About1(FormCollection collection) { return "SubmitToAbout1 clicked"; } [HttpPost] [MultiButton(MatchFormKey = "action", MatchFormValue = "SubmitToAbout2")] public string About2(FormCollection collection) { return "SubmitToAbout2 clicked"; }
這樣,點擊submit按鈕時,MultiButton會根據按鈕的name和value值跳轉到相應的執行方法。
3、判斷按鈕的name值
判斷按鈕的value值有很多不確定的因素,比如按鈕的value值可能會更加客戶的個人愛好而進行改動,或者按鈕需要改成多語言版本的,這時我們根據按鈕的value值來選擇不同的控制器的Action時就顯得極其不靈活,這時我們希望通過按鈕的name值來選擇其相應的Action方法。同樣還是自定義一個MultiButtonAttribute類,該類繼承ActionNameSelectorAttribute類,該類代碼為:
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class MultiButtonAttribute : ActionNameSelectorAttribute { public string MatchFormValue { get; set; } public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo) { bool state = !string.IsNullOrEmpty(MatchFormValue) && controllerContext.HttpContext.Request.Form.AllKeys.Contains(this.MatchFormValue); return state; } }
視圖上按鈕代碼為:
<input type="submit" value="SubmitToAbout1" name="about1"/> <input type="submit" value="SubmitToAbout2" name="about2"/>
控制器Action代碼:
[HttpPost] [MultiButton(MatchFormValue = "about1")] public string About1(FormCollection collection) { return "SubmitToAbout1 clicked"; } [HttpPost] [MultiButton(MatchFormValue = "about2")] public string About2(FormCollection collection) { return "SubmitToAbout2 clicked"; }
這樣就可以根據不同的按鈕的name,控制器來執行其相應的方法了。