我已尝试实施this article.
中解释的选项 public class HttpParamActionAttribute : ActionNameSelectorAttribute
{
public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
{
if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
return true;
if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase))
return false;
var request = controllerContext.RequestContext.HttpContext.Request;
return request[methodInfo.Name] != null;
}
}
我的控制器操作:
[HttpParamAction]
[HttpPost]
public virtual ActionResult EditAccouncement(_AccouncementPostViewModel m)
[HttpParamAction]
[HttpPost]
public virtual PartialViewResult DeleteAnnouncement(int id)
我的表格:
@using (Ajax.BeginForm("Action", ajaxOptions: new AjaxOptions()
{
HttpMethod = "POST",
InsertionMode = InsertionMode.Replace,
UpdateTargetId = "announcement" + @Model.id
}))
{
//form values omitted
<button type="submit" class="submitbutton" name="edit">Change details</button>
<button type="submit" class="submitbutton" name="delete">Delete</button>
}
然而,被调用的控制器动作仍然只是Action方法(不存在)。我错过了什么吗?
答案 0 :(得分:1)
您的问题是由您的操作名称与按钮名称属性不匹配引起的。
按钮上name属性的值需要与动作名称匹配,如下所示:
<button type="submit" name="EditAccouncement">Change details</button>
<button type="submit" name="DeleteAnnouncement">Delete</button>
更新:我会建议采用不同的方法。这个解决方案对我来说似乎是违反直觉的,并不是特别容易理解。
您可以轻松地使用JavaScript(例如jquery)来处理表单“手动”提交,方法是将两个不同的事件处理程序连接到按钮。一个事件会对EditAccouncement(拼写错误!)操作进行POST,并且会对DeleteAnnouncement操作进行POST。
我在jsfiddle上做了一个模型,它演示了代码:http://jsfiddle.net/wmWNj/3/
更新2:修复了jsfiddle中的拼写错误