MVC3實現多個按鈕提交


有時我們需要在同一個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,控制器來執行其相應的方法了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM