0

我的页面上有一个表单,有两种提交方式。第一个是锚标记,另一个是提交按钮,它们都有不同的行为。

如何为每个单独的操作方法分配?谢谢。

4

5 回答 5

2

这真的取决于锚标记的作用 - 大概它触发了 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(如果您这样做的话)都不会提交此值,因为按钮的值仅在单击时提交。

于 2012-05-22T08:58:10.110 回答
1

只需在不同版本的操作上使用 MVC HttpPostHttpGet属性:

[HttpPost]
public ActionResult FormAction(Model model, string method = post) { ... }

[HttpGet]
public ActionResult FormAction(Model model) { ... }
于 2012-05-22T08:55:50.763 回答
0

只是为了添加另一个解决方案,如果您想创建可以在关闭 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)
{ ... }
于 2012-05-22T09:29:39.093 回答
0

您可以使用 Url.Action 或 Html.ActionLink http://geekswithblogs.net/liammclennan/archive/2008/05/21/122298.aspx

于 2012-05-22T08:57:03.243 回答
0

如果方法完全不同,那么您应该使用 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
});
于 2012-05-22T09:03:42.373 回答