138

我的 MVC 表单上有两个按钮:

<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

从我的控制器操作中,我如何知道按下了哪一个?

4

11 回答 11

182

将两个提交按钮命名为相同

<input name="submit" type="submit" id="submit" value="Save" />
<input name="submit" type="submit" id="process" value="Process" />

然后在您的控制器中获取提交的值。只有单击的按钮才会传递其值。

public ActionResult Index(string submit)
{
    Response.Write(submit);
    return View();
}

您当然可以评估该值以使用 switch 块执行不同的操作。

public ActionResult Index(string submit)
{
    switch (submit)
    {
        case "Save":
            // Do something
            break;
        case "Process":
            // Do something
            break;
        default:
            throw new Exception();
            break;
    }

    return View();
}
于 2009-11-11T10:26:39.390 回答
51
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

在您的控制器操作中:

public ActionResult SomeAction(string submit)
{
    if (!string.IsNullOrEmpty(submit))
    {
        // Save was pressed
    }
    else
    {
        // Process was pressed
    }
}
于 2009-11-11T09:23:36.657 回答
36

这是一个更好的答案,所以我们可以同时拥有按钮的文本和值:

http://weblogs.asp.net/dfindley/archive/2009/05/31/asp-net-mvc-multiple-buttons-in-the-same-form.aspx

</p>
<button name="button" value="register">Register</button>
<button name="button" value="cancel">Cancel</button>
</p>

和控制器:

public ActionResult Register(string button, string userName, string email, string password, string confirmPassword)
{
if (button == "cancel")
    return RedirectToAction("Index", "Home");
...

简而言之,它是一个 SUBMIT 按钮,但您使用 name 属性选择名称,它更强大,因为您没有义务在控制器方法参数中使用名称提交或按钮,您可以随意调用它...

于 2013-01-07T11:14:46.847 回答
22

您可以从那里的名称标签中识别您的按钮,如下所示,您需要在控制器中进行这样的检查

if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}
于 2016-05-04T09:29:11.767 回答
6

这是一个非常好的和简单的方法,使用自定义 MultiButtonAttribute 非常容易遵循说明:

http://blog.maartenballiauw.be/post/2009/11/26/Supporting-multiple-submit-buttons-on-an-ASPNET-MVC-view.aspx

总而言之,让您的提交按钮如下所示:

<input type="submit" value="Cancel" name="action" />
<input type="submit" value="Create" name="action" /> 

你的行为是这样的:

[HttpPost]
[MultiButton(MatchFormKey="action", MatchFormValue="Cancel")]
public ActionResult Cancel()
{
    return Content("Cancel clicked");
}

[HttpPost]
[MultiButton(MatchFormKey = "action", MatchFormValue = "Create")]
public ActionResult Create(Person person)
{
    return Content("Create clicked");
} 

并创建这个类:

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

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        return controllerContext.HttpContext.Request[MatchFormKey] != null &&
            controllerContext.HttpContext.Request[MatchFormKey] == MatchFormValue;
    }
}
于 2013-01-31T12:23:44.543 回答
3
// Buttons
<input name="submit" type="submit" id="submit" value="Save" />
<input name="process" type="submit" id="process" value="Process" />

// Controller
[HttpPost]
public ActionResult index(FormCollection collection)
{
    string submitType = "unknown";

    if(collection["submit"] != null)
    {
        submitType = "submit";
    }
    else if (collection["process"] != null)
    {
        submitType = "process";
    }

} // End of the index method
于 2014-09-18T14:24:07.393 回答
3

为了更容易,我会说您可以将按钮更改为以下内容:

<input name="btnSubmit" type="submit" value="Save" />
<input name="btnProcess" type="submit" value="Process" />

你的控制器:

public ActionResult Create(string btnSubmit, string btnProcess)
{
    if(btnSubmit != null)
       // do something for the Button btnSubmit
    else 
       // do something for the Button btnProcess
}
于 2014-07-31T07:38:06.500 回答
2

这篇文章不会回复 Coppermill,因为他很久以前就已经得到了回复。我的帖子将对寻求此类解决方案的人有所帮助。首先,我不得不说“WDuffy 的解决方案是完全正确的”,它工作正常,但我的解决方案(实际上不是我的)将用于其他元素,它使表示层更加独立于控制器(因为你的控制器依赖于“value”用于显示按钮的标签,此功能对于其他语言很重要。)。

这是我的解决方案,给他们不同的名字:

<input type="submit" name="buttonSave" value="Save"/>
<input type="submit" name="buttonProcess" value="Process"/>
<input type="submit" name="buttonCancel" value="Cancel"/>

您必须在如下操作中指定按钮的名称作为参数:

public ActionResult Register(string buttonSave, string buttonProcess, string buttonCancel)
{
    if (buttonSave!= null)
    {
        //save is pressed
    }
    if (buttonProcess!= null)
    {
        //Process is pressed
    }
    if (buttonCancel!= null)
    {
        //Cancel is pressed
    }
}

当用户使用其中一个按钮提交页面时,只有一个参数有值。我想这对其他人会有所帮助。

更新

这个答案很老,我实际上重新考虑了我的观点。也许上述解决方案适用于将参数传递给模型属性的情况。不要打扰自己,为您的项目采取最佳解决方案。

于 2013-11-01T02:27:26.020 回答
1

使用 Request.Form Collection 找不到吗?如果单击进程,则 request.form["process"] 不会为空

于 2009-11-11T09:24:12.943 回答
0

在 Core 2.2 Razor 页面中,此语法有效:

    <button type="submit" name="Submit">Save</button>
    <button type="submit" name="Cancel">Cancel</button>
public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
        return Page();
    var sub = Request.Form["Submit"];
    var can = Request.Form["Cancel"];
    if (sub.Count > 0)
       {
       .......
于 2019-03-15T23:35:30.640 回答
0

为两个按钮命名并从表单中获取检查值。

<div>
   <input name="submitButton" type="submit" value="Register" />
</div>

<div>
   <input name="cancelButton" type="submit" value="Cancel" />
</div>

在控制器端:

public ActionResult Save(FormCollection form)
{
 if (this.httpContext.Request.Form["cancelButton"] !=null)
 {
   // return to the action;
 }

else if(this.httpContext.Request.Form["submitButton"] !=null)
 {
   // save the oprtation and retrun to the action;
 }
}
于 2017-05-01T13:01:36.993 回答