1

我已经尝试实现本文中解释的选项。

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

4

1 回答 1

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

于 2013-08-19T21:44:02.613 回答