日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC中实现多个按钮提交的几种方法

發布時間:2025/7/14 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC中实现多个按钮提交的几种方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時候會遇到這種情況:在一個表單上需要多個按鈕來完成不同的功能,比如一個簡單的審批功能。

?

如果是用webform那不需要討論,但asp.net mvc中一個表單只能提交到一個Action處理,相對比較麻煩點。

方法一:使用客戶端腳本?

比如我們在View中這樣寫:

<inputtypeinputtype="submit"value="審核通過"onclick='this.form.action="<%=Url.Action("Action1")%>/> <inputtypeinputtype="submit"value="審核不通過"onclick='this.form.action="<%=Url.Action("Action2")%> /> <inputtypeinputtype="submit"value="返回"onclick='this.form.action="<%=Url.Action("Action3")%>" />

在點擊提交按鈕時,先改變Form的action屬性,使表單提交到按鈕相應的action處理。

但有的時候,可能Action1和2的邏輯非常類似,也許只是將某個字段的值置為1或者0,那么分開到二個action中又顯得有點多余了。

?

方法二:在Action中判斷通過哪個按鈕提交

在View中,我們不用任何客戶端腳本處理,給每個提交按鈕加好name屬性:

<input type="submit" value="審核通過" name="action" /> <input type="submit" value="審核不通過" name="action"/> <input type="submit" value="返回" name="action"/>

然后在控制器中判斷:

[HttpPost] public ActionResult Index(string action /* 其它參數*/) { if (action=="審核通過") { // } else if (action=="審核不通過") { // } else { // } }

幾年前寫asp代碼的時候經常用這樣的方法…

View變得簡單的,Controller復雜了。

太依賴說View,會存在一些問題。假若哪天客戶說按鈕上的文字改為“通過審核”,或者是做個多語言版的,那就麻煩了。

參考:http://www.ervinter.com/2009/09/25/asp-net-mvc-how-to-have-multiple-submit-button-in-form/

?

方法三:使用ActionSelector

關于ActionSelector的基本原理可以先看下這個POST使用ActionSelector控制Action的選擇。

使用此方法,我們可以將控制器寫成這樣:

[HttpPost] [MultiButton("action1")] public ActionResult Action1() { // return View(); } [HttpPost] [MultiButton("action2")] public ActionResult Action2() { // return View(); }

在 View中:

?

<input type="submit" value="審核通過" name="action1" /> <input type="submit" value="審核不通過" name="action2"/> <input type="submit" value="返回" name="action3"/>

?

此時,Controller已經無須依賴于按鈕的Value值。

MultiButtonAttribute的定義如下:

?

public class MultiButtonAttribute : ActionNameSelectorAttribute { public string Name { get; set; } public MultiButtonAttribute(string name) { this.Name = name; } public override bool IsValidName(ControllerContext controllerContext, string actionName, System.Reflection.MethodInfo methodInfo) { if (string.IsNullOrEmpty(this.Name)) { return false; } return controllerContext.HttpContext.Request.Form.AllKeys.Contains(this.Name); } }

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

?

方法四、改進

?

Thomas Eyde就方法三的方案給出了個改進版:

Controller:?

[HttpPost] [MultiButton(Name = "delete", Argument = "id")] public ActionResult Delete(string id) { var response = System.Web.HttpContext.Current.Response; response.Write("Delete action was invoked with " + id); return View(); }

View:

<input type="submit" value="not important" name="delete" /> <input type="submit" value="not important" name="delete:id" />

?

MultiButtonAttribute定義:

?

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class MultiButtonAttribute : ActionNameSelectorAttribute { public string Name { get; set; } public string Argument { get; set; } public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) { var key = ButtonKeyFrom(controllerContext); var keyIsValid = IsValid(key); if (keyIsValid) { UpdateValueProviderIn(controllerContext, ValueFrom(key)); } return keyIsValid; } private string ButtonKeyFrom(ControllerContext controllerContext) { var keys = controllerContext.HttpContext.Request.Params.AllKeys; return keys.FirstOrDefault(KeyStartsWithButtonName); } private static bool IsValid(string key) { return key != null; } private static string ValueFrom(string key) { var parts = key.Split(":".ToCharArray()); return parts.Length < 2 ? null : parts[1]; } private void UpdateValueProviderIn(ControllerContext controllerContext, string value) { if (string.IsNullOrEmpty(Argument)) return; controllerContext.Controller.ValueProvider[Argument] = new ValueProviderResult (value, value, null); } private bool KeyStartsWithButtonName(string key) { return key.StartsWith(Name, StringComparison.InvariantCultureIgnoreCase); } } //如果是在MVC 2.0中的話,將UpdateValueProviderIn方法改為: private void UpdateValueProviderIn(ControllerContext controllerContext, string value) { if (string.IsNullOrEmpty(Argument)) return; controllerContext.RouteData.Values[this.Argument] = value; }

?

轉載于:https://www.cnblogs.com/BrokenIce/p/5733054.html

總結

以上是生活随笔為你收集整理的ASP.NET MVC中实现多个按钮提交的几种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。