一种形式的多个不同的提交按钮

时间:2013-08-19 21:10:47

标签: html asp.net-mvc asp.net-mvc-4 razor

我已尝试实施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方法(不存在)。我错过了什么吗?

1 个答案:

答案 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中的拼写错误