標籤:
有時我們需要在同一個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,控制器來執行其相應的方法了。
實現多個按鈕提交