在ASP.NET MVC框架中,如何处理多个提交按钮?

发布时间 2023-11-06 19:47:42作者: 小满独家

内容来自 DOC https://q.houxu6.top/?s=在ASP.NET MVC框架中,如何处理多个提交按钮?

在ASP.NET Framework Beta中,有几种方法可以处理同一表单中的多个提交按钮。

一种方法是使用一个隐藏字段来区分不同的提交按钮。例如:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="hidden" name="submitType" value="Send" />
<input type="submit" value="Send" />
<input type="hidden" name="submitType" value="Cancel" />
<input type="submit" value="Cancel" />
<% Html.EndForm(); %>

在后端代码中,您可以使用submitType参数来确定哪个按钮被点击了。

public ActionResult MyAction(string submitType)
{
    if (submitType == "Send")
    {
        // 处理发送按钮的点击事件
    }
    else if (submitType == "Cancel")
    {
        // 处理取消按钮的点击事件
    }
    ...
}

另一种方法是使用JavaScript来处理多个提交按钮。您可以将每个按钮附加一个唯一的ID或类名,并在JavaScript中为每个按钮添加事件处理程序。例如:

<% Html.BeginForm("MyAction", "MyController", FormMethod.Post); %>
<input type="submit" id="sendButton" value="Send" />
<input type="submit" id="cancelButton" value="Cancel" />
<% Html.EndForm(); %>

<script>
    document.getElementById("sendButton").addEventListener("click", function() {
        // 处理发送按钮的点击事件
    });
    document.getElementById("cancelButton").addEventListener("click", function() {
        // 处理取消按钮的点击事件
    });
</script>

这是一个基于属性的、基本干净的多提交按钮解决方案,主要基于Maarten Balliauw的帖子和评论。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
    public string Name { get; set; }
    public string Argument { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        var isValidName = false;
        var keyValue = string.Format("{0}:{1}", Name, Argument);
        var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

        if (value != null)
        {
            controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
            isValidName = true;
        }

        return isValidName;
    }
}

Razor:

<form action="" method="post">
 <input type="submit" value="Save" name="action:Save" />
 <input type="submit" value="Cancel" name="action:Cancel" />
</form>

控制器:

[HttpPost]
[MultipleButton(Name = "action", Argument = "Save")]
public ActionResult Save(MessageModel mm) { ... }

[HttpPost]
[MultipleButton(Name = "action", Argument = "Cancel")]
public ActionResult Cancel(MessageModel mm) { ... }

更新: Razor页面似乎提供了与上述相同的功能,对于新开发来说可能更可取。