我的页面上有一个表单,有两种提交方式。第一个是锚标记,另一个是提交按钮,它们都有不同的行为。
如何为每个单独的操作方法分配?谢谢。
我的页面上有一个表单,有两种提交方式。第一个是锚标记,另一个是提交按钮,它们都有不同的行为。
如何为每个单独的操作方法分配?谢谢。
这真的取决于锚标记的作用 - 大概它触发了 javascript 中的提交?
如果它实际上只是在做 aGET
而不是 a POST
,那么您可以按照@dbaseman 的建议进行操作 - 为两种请求类型提供单独的操作方法。
但是,如果锚点确实 javascript 提交,那么我的偏好是简单地给提交按钮一个名称,以便您可以在服务器上以一种操作方法检测它,然后从那里分叉代码:
<submit name="fromButtom" value="Submit" />
然后你的操作方法:
public ActionResult Foo(string fromButton)
{
//if 'fromButton' contains 'Submit' then you assume it was the button.
}
更好的是,您可以使用 a<button>
代替,然后您可以将显示的文本与按钮提交的值分开(如果您正在本地化页面,这很有用):
<button name="submitMethod" value="fromButton">Submit</button>
现在您可以submitMethod
在您的操作方法上有一个参数,您可以在其中查找'fromButton'
.
无论哪种方式 - 锚标记/javascript(如果您这样做的话)都不会提交此值,因为按钮的值仅在单击时提交。
只需在不同版本的操作上使用 MVC HttpPost和HttpGet属性:
[HttpPost]
public ActionResult FormAction(Model model, string method = post) { ... }
[HttpGet]
public ActionResult FormAction(Model model) { ... }
只是为了添加另一个解决方案,如果您想创建可以在关闭 javascript 的情况下使用的东西,并且更改按钮名称和值不方便,那么您可以尝试我在生产代码中使用的这个。
创建一个这样的助手:
using System;
using System.Reflection;
using System.Web.Mvc;
namespace Whatever
{
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class MultipleSubmitAttribute : ActionNameSelectorAttribute
{
public string Name { get; set; }
public string Argument { get; set; }
public override bool IsValidName(ControllerContext controllerContext,
string actionName, MethodInfo methodInfo)
{
bool isValidName = false;
string keyValue = string.Format("{0}:{1}", Name, Argument);
var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);
if (value != null)
{
value = new ValueProviderResult(Argument, Argument, null);
controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
isValidName = true;
}
return isValidName;
}
}
}
现在在您的表单中,您可以执行以下操作:
<input type="submit" name="action:DoSomething" value="Do something" />
<input type="submit" name="action:DoSomethingElse" value="Do something else" />
然后在您的控制器中,您可以像这样装饰您的操作方法:
[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomething")]
public ActionResult DoSomething(ViewModel vm)
{ ... }
[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomethingElse")]
public ActionResult DoSomethingElse(ViewModel vm)
{ ... }
您可以使用 Url.Action 或 Html.ActionLink http://geekswithblogs.net/liammclennan/archive/2008/05/21/122298.aspx。
如果方法完全不同,那么您应该使用 JavaScript 使它们的行为不同。以 jQuery 为例,它看起来像:
$("#sbutton").click(function() {
alert("Submit button clicked!");
// Do whatever you need - validate/initialize-fields/etc.
return false; // This is required to prevent normal form submit
});
$("#slink").click(function() {
alert("Link clicked!");
// Do whatever you need - validate/initialize-fields/etc.
return false; // This is required to prevent normal form submit
});