MVC 的提交按钮已被按下

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

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

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

149631 次浏览
<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
}
}

使用 Request.Form 集合是否可以找到? 如果单击 process,那么 Request.Form [“ process”]将不为空

两个提交按钮的名称相同

<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();
}

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

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


return View();
}

这里有一个非常好和简单的方法,使用一个自定义 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;
}
}

这篇文章不会回答科波米尔的问题,因为他很久以前就被回答了。我的帖子将有助于谁将寻求这样的解决方案。首先,我必须说“ WDuffy 的解决方案是完全正确的”,它工作得很好,但是我的解决方案(实际上不是我的)将用于其他元素,它使表示层更独立于控制器(因为你的控制器依赖于“值”,它用于显示按钮的标签,这个功能对其他语言很重要).

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

<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
}
}

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

更新

这个答案很老了,我实际上重新考虑了我的观点。也许上述解对于将参数传递给模型性质的情况是有利的。不要自找麻烦,为你的项目找到最好的解决方案。

为了方便起见,我会说你可以把你的按钮改成以下几个:

<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
}
// 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

你可以通过下面的名字标签来识别你的按钮, 您需要在控制器中像这样检查

if (Request.Form["submit"] != null)
{
//Write your code here
}
else if (Request.Form["process"] != null)
{
//Write your code here
}

给这两个按钮命名,然后从 form 获取值。

<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;
}
}

在 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)
{
.......