在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。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
2010-10-15 通过System.Management获取操作系统信息