在Asp.net Web Form 中,每個單獨的 HTML Form 有時會包含多個Submit的button. 那么用戶最后點擊那一個Button. 我們通常需要借助Javascript來幫助我們,先看下面的Html代碼:
<form name="myform" id="myform" method="post">
<input type="text" id="username" />
<input type="text" id="password" />
<br />
<input type="submit" value="Update" name="updateaction" onclick="setAction('update')" />
<input type="submit" value="Delete" name="deleteaction" onclick="setAction('delete')" />
</form>
那么這時需要這樣的Javascript,定義一個setAction的function,如果您熟悉Javascript不難看懂:
<script type="text/javascript">
function setAction(action) {
document.getElementById("myform").action = action;
}
</script>
在 Asp.net MVC 應用程序中,我們不能這樣一直到處添加上面這樣的代碼。那么我們實現一個自定義的Attribute:
/// <summary>
/// OnlyIfPostedFromButtonAttribute
/// </summary>
public class OnlyIfPostedFromButtonAttribute : ActionMethodSelectorAttribute
{
public String SubmitButton { get; set; }
public String ViewModelSubmitButton { get; set; }
public override Boolean IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
{
var buttonName = controllerContext.HttpContext.Request[SubmitButton];
if (buttonName == null)
{
//This is neccessary to support the RemoteAttribute that appears to intercepted the form post
//and removes the submit button from the Request (normally detected in the code above)
var viewModelSubmitButton = controllerContext.HttpContext.Request[ViewModelSubmitButton];
if ((viewModelSubmitButton == null) || (viewModelSubmitButton != SubmitButton))
return false;
}
// Modify the requested action to the name of the method the attribute is attached to
controllerContext.RouteData.Values["action"] = methodInfo.Name;
return true;
}
}
對應的我們假設有這樣的Model與Controller:
public class PeterLiuViewModel
{
[Remote("UserAlreadyRegistered", "PeterLiu", AdditionalFields = "Version", ErrorMessage = "This Username is already registered with the agency.")]
public string UserName { get; set; }
public int Version { get; set; }
public string SubmitButtonName { get; set; }
}
在當前上下文Controller中的Action中增加這樣的方法, 你可以看到OnlyIfPostedFromButton的Attribute指定每個Action,需要對應的Submit的button。這里還有增加ActionName
[HttpPost]
[ActionName("Details")]
[OnlyIfPostedFromButton(SubmitButton = "editUser", ViewModelSubmitButton = "SubmitButtonName")]
public ActionResult DetailsEditUser(PeterLiuViewModel nom)
{
return RedirectToAction("Edit", "Home", new { id = nom.UserName });
}
[HttpPost]
[ActionName("Details")]
[OnlyIfPostedFromButton(SubmitButton = "sendActivationEmail", ViewModelSubmitButton = "SubmitButtonName")]
public ActionResult DetailsSendActivationEmail(PeterLiuViewModel nom)
{
return RedirectToAction("SendActivationEmail", "Home", new { id = nom.UserName });
}
好的,讓我們來看View的Razor語法的代碼:
@using (Html.BeginForm("Details","Home"))
{
<p>
@Html.LabelFor(m => m.UserName)
@Html.DisplayFor(m => m.UserName)
</p>
<input type="submit" name="editUser" value="Edit" data-action="editUser" />
<input type="submit" name="sendActivationEmail" value="SendActivationEmail" data-action="sendActivationEmail" />
@Html.HiddenFor(m => m.SubmitButtonName)
}
<script type="text/javascript">
$(document).ready(function () {
$("input[type=submit][data-action]").click(function (e) {
var action = $(this).attr('data-action');
$("#SubmitButtonName").val(action);
});
});
</script>
上面的代碼可以看出,我們放置了一個Hidden input,然后用JQuery前端取得data-action的特性值把它做為val給SubmitButtonName的Hidden input。代碼很簡單,希望對您開發有幫助。
您可以感興趣的文章:
實現Asp.net MVC中AjaxOnly特性
Asp.net MVC3擴展之Ajax異常處理特性
作者:Petter Liu
出處:http://www.cnblogs.com/wintersun/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
該文章也同時發布在我的獨立博客中-Petter Liu Blog。