ASP.NETMVC3multiplesubmit

ASP.NETMVC3multiplesubmit,asp.net,asp.net-mvc-3,submit,action,Asp.net,Asp.net Mvc 3,Submit,Action,我的页面上只有一个表单,有两种提交方式。第一个是锚定标记,另一个是提交按钮,它们都有不同的行为 我如何为每个人分配一个单独的操作方法?谢谢。只需在操作的不同版本上使用MVCHttpPost和HttpGet属性即可: [HttpPost] public ActionResult FormAction(Model model, string method = post) { ... } [HttpGet] public ActionResult FormAction(Model model) {

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


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

只需在操作的不同版本上使用MVCHttpPostHttpGet属性即可:

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

[HttpGet]
public ActionResult FormAction(Model model) { ... }

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

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

[HttpGet]
public ActionResult FormAction(Model model) { ... }

您可以使用Url.Action或Html.ActionLink。

您可以使用Url.Action或Html.ActionLink。

这实际上取决于锚定标记的作用-它可能会触发javascript中的提交

如果它实际上只是执行一个
GET
而不是一个
POST
,那么您可以按照@dbaseman的建议执行—为这两种请求类型提供单独的操作方法

但是,如果锚定确实进行javascript提交,那么我的首选方法是简单地给提交按钮一个名称,这样您就可以通过一个操作方法在服务器上检测到它,然后从那里派生代码:

<submit name="fromButtom" value="Submit" />
更好的是,您可以使用
,然后您可以将显示的文本与按钮提交的值分离(如果您正在本地化页面,则很有用):

提交
现在,您可以在操作方法上有一个
submitMethod
参数,在其中查找
'fromButton'


无论哪种方式-锚定标记/javascript(如果您这样做的话)都不会提交此值,因为按钮的值只有在单击时才会提交。

这实际上取决于锚定标记的作用-可能它触发了javascript中的提交

如果它实际上只是执行一个
GET
而不是一个
POST
,那么您可以按照@dbaseman的建议执行—为这两种请求类型提供单独的操作方法

但是,如果锚定确实进行javascript提交,那么我的首选方法是简单地给提交按钮一个名称,这样您就可以通过一个操作方法在服务器上检测到它,然后从那里派生代码:

<submit name="fromButtom" value="Submit" />
更好的是,您可以使用
,然后您可以将显示的文本与按钮提交的值分离(如果您正在本地化页面,则很有用):

提交
现在,您可以在操作方法上有一个
submitMethod
参数,在其中查找
'fromButton'


无论哪种方式-锚定标记/javascript(如果您这样做的话)都不会提交此值,因为按钮的值只有在单击时才会提交。

如果方法完全不同,那么您应该使用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
});

如果这些方法完全不同,那么应该使用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
});

只是为了添加另一个解决方案,如果您想创建一些可以在关闭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;
        }
    }
}
[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomething")]
public ActionResult DoSomething(ViewModel vm)
{ ... }

[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomethingElse")]
public ActionResult DoSomethingElse(ViewModel vm)
{ ... }
现在以你的形式你可以做这样的事情:

<input type="submit" name="action:DoSomething" value="Do something" /> 
<input type="submit" name="action:DoSomethingElse" value="Do something else" />

只是为了添加另一个解决方案,如果您想创建一些可以在关闭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;
        }
    }
}
[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomething")]
public ActionResult DoSomething(ViewModel vm)
{ ... }

[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomethingElse")]
public ActionResult DoSomethingElse(ViewModel vm)
{ ... }
现在以你的形式你可以做这样的事情:

<input type="submit" name="action:DoSomething" value="Do something" /> 
<input type="submit" name="action:DoSomethingElse" value="Do something else" />

您可以在提交之前使用javascript更改操作方法。您可以在提交之前使用javascript更改操作方法。您可能希望在此处更改方法名称-这不会编译。你需要不同的方法名和一个
[ActionName]
在那里:)@AndrasZoltan,除非我把它弄丢了(完全有可能,因为现在是凌晨2点),这应该是正确的。你觉得有什么问题?哈哈,我去过!两种方法具有相同的名称和相同的参数;i、 e.它们是重复的:)您可能想在此处更改方法名称-这不会编译。你需要不同的方法名和一个
[ActionName]
在那里:)@AndrasZoltan,除非我把它弄丢了(完全有可能,因为现在是凌晨2点),这应该是正确的。你觉得有什么问题?哈哈,我去过!两种方法具有相同的名称和相同的参数;i、 e.它们是重复的:)太好了,我可以使用这个解决方案,但是我使用提交按钮中的值作为显示文本,我不想在代码中依赖它。我正在使用一个自定义html帮助程序,如下所示:很好,我可以使用这个解决方案,但是我正在使用submit按钮中的值作为我的显示文本,我不想在代码中依赖它。我正在使用一个定制的html助手,如下所示。如果我有两个按钮,而不是一个标签和一个按钮,这个解决方案将非常有效。是的,我只是想它可能会在将来使用时派上用场。另外,您可以使用如下javascript从
标记提交它:
onclick=“$(this).parents('form').submit();return false;“
如果我有两个按钮,而不是一个标记和一个按钮,那么这个解决方案会很好用。啊,我只是认为它可能会在将来使用时派上用场。另外,您可以使用如下javascript从
标记提交它:
onclick=“$(this).parents('form').submit();return false;”