【问题标题】:ASP.Net MVC 4 Form with 2 submit buttons/actions带有 2 个提交按钮/操作的 ASP.Net MVC 4 表单
【发布时间】:2013-05-05 00:02:12
【问题描述】:

我在 ASP.Net 和 razor 中有一个表单。

我需要有两种提交表单的方式:一种通过Edit 操作,另一种通过Validate 操作。

我该怎么做呢?

我不介意为此使用 JavaScript。

编辑:

使用自定义属性出现此错误。

当前对控制器类型“InspecoesController”的操作“Resultados”的请求在以下操作方法之间不明确: 类型 Waveform.IEP.Intus.Server.Web.Controllers 上的 System.Web.Mvc.ActionResult Validar(System.Collections.Generic.ICollection1[Waveform.IEP.Intus.Server.Web.ViewModels.ResultadoViewModel]) on type Waveform.IEP.Intus.Server.Web.Controllers.InspecoesController System.Web.Mvc.ActionResult Resultados(System.Collections.Generic.ICollection1[Waveform.IEP.Intus.Server.Web.ViewModels.ResultadoViewModel])。 InspecoesController

【问题讨论】:

标签: asp.net razor


【解决方案1】:

您可以使用 jquery 来完成,只需将两种方法提交到不同的 url,例如使用此表单:

<form id="myForm">
    <%-- form data inputs here ---%>
    <button id="edit">Edit</button>
    <button id="validate">Validate</button>
</form>

你可以使用这个脚本(确保它位于 View 中,以便使用 Url.Action 属性):

<script type="text/javascript">
      $("#edit").click(function() {
          var form = $("form#myForm");
          form.attr("action", "@Url.Action("Edit","MyController")");
          form.submit();
      });

      $("#validate").click(function() {
          var form = $("form#myForm");
          form.attr("action", "@Url.Action("Validate","MyController")");
          form.submit();
      });
</script>

【讨论】:

  • 我不知道form.attr()。这应该可以解决问题。谢谢。
  • 使用 javascript/jquery,您可以操作任何 dom 属性,尤其是带有 attr() 的元素属性。如果您不确定是否需要使用 jquery 文档 (docs.jquery.com) 的方法 - 有很多知识..
  • 您应该使用#edit 语法而不是button#edit,假设您没有跨不同元素类型的重复ID(这是我可以看到使用它的唯一原因)。按 ID 查询要快得多。如果您在 RHS 上使用非 ID 选择器,您的情况会好一些,因为它会减少列表。但是因为普通 ID 选择器使用DOM.getElementById('')(至少,不必先找到所有button 元素),它会更快。
  • @JoeBrockhaus - 这与这个问题无关,但这是一个很好的观点,所以我已经更正了我的答案。
  • 同意,无关 :) 很高兴我能帮上忙!
【解决方案2】:

这就是我们在应用程序中拥有的:
属性

public class HttpParamActionAttribute : ActionNameSelectorAttribute
{
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
}

用它装饰的动作:


[HttpParamAction]
public ActionResult Save(MyModel model)
{
    // ...
}

[HttpParamAction]
public ActionResult Publish(MyModel model)
{
    // ...
}

HTML/Razor

@using (@Html.BeginForm())
{
    <!-- form content here -->
    <input type="submit" name="Save" value="Save" />
    <input type="submit" name="Publish" value="Publish" />
}

name 提交按钮的属性应该匹配动作/方法名称

这样您就不必在 javascript 中硬编码网址

【讨论】:

  • 您是否为表单设置了action 属性值? @using (Html.BeginForm()) 应该足够了。这很奇怪,因为在写这篇评论的那一刻,我正在实现完全相同的东西,它只是工作
  • 好。我已将我的重命名为 ButtonNameActionAttribute:然后控制器看起来更干净,触感更明显。
  • 这在紧要关头很容易,但是当您在同一个控制器中有其他操作方法时,它会导致很多其他问题。更不用说视图和控制器之间的隐式契约(一个很大的禁忌)。我选择了一个轻量级的 JS 函数,它可以在提交之前更改表单操作,例如下面的@ŁukaszW.pl
  • 我喜欢这种方法。如果您想添加 HTML 属性,例如对于 Bootstrap,在保持无参数 Html.BeginForm() 的默认行为的同时,您可以将 null 传递给操作和控制器。这是一个例子:Html.BeginForm(null, null, FormMethod.Post, new { @class = "form-horizontal", role = "form" })
  • @Ramunas 正如人们在上面告诉你的那样,很好的解决方案!并不是说它有效,但它也是一种聪明的方法,我非常喜欢它。不敢相信你收到了 -1,这也发生在我身上,每个人都知道,然后 - 可能有一些关于 SO 的帽子。从我这里投票! :-)
【解决方案3】:

这是一个很好的解释: ASP.NET MVC – Multiple buttons in the same form

两句话:
您可以在您的操作中分析已提交按钮的值

使用您的 ActionMethodSelectorAttribute 版本进行单独操作(我个人更喜欢并建议)。

【讨论】:

  • 我的回答是采纳版文章:)
  • 完美!使用 JQuery/Javascript 顺便说一句,对于自定义 ActionMethodSelectorAttribute 方法,您将这个类放在哪里?它是否需要以某种方式注册到框架中?
【解决方案4】:

如果您使用 razor 在 asp.net 中工作,并且想要控制多个提交按钮事件。那么这个答案将指导您。例如,我们有两个按钮,一个按钮将我们重定向到“PageA.cshtml”,另一个将我们重定向到“PageB.cshtml”。

@{
  if (IsPost)
    {
       if(Request["btn"].Equals("button_A"))
        {
          Response.Redirect("PageA.cshtml");
        }
      if(Request["btn"].Equals("button_B"))
        {
          Response.Redirect("PageB.cshtml");
        }
  }
}
<form method="post">
   <input type="submit" value="button_A" name="btn"/>;
   <input type="submit" value="button_B" name="btn"/>;          
</form>

【讨论】:

    【解决方案5】:

    <input type="submit" value="Create" name="button"/>
    <input type="submit" value="Reset" name="button" />

    在 Controler 中编写以下代码。

    [HttpPost]
            public ActionResult Login(string button)
            {
                switch (button)
                {
                    case "Create":
                        return RedirectToAction("Deshboard", "Home");
                        break;
                    case "Reset":
                        return RedirectToAction("Login", "Home");
                        break;
                }
    
                return View();
            }
    

    【讨论】:

      【解决方案6】:

      使用 HTML5 你可以使用button[formaction]:

      <form action="Edit">
        <button type="submit">Submit</button> <!-- Will post to default action "Edit" -->
        <button type="submit" formaction="Validate">Validate</button> <!-- Will override default action and post to "Validate -->
      </form>
      

      【讨论】:

        【解决方案7】:

        我们可以通过两种方式实现,

        要么在同一个视图中有 2 个表单提交,要么在控制器中有 2 个 Action 方法,但您需要提交必填字段和要放置的表单

        这里给出了代码Multiple forms in view asp.net mvc with multiple submit buttons

        或者

        有 2 个或多个提交按钮,例如 btnSubmit1 和 btnSubmit2,并检查 Action 方法使用代码单击了哪个按钮

        if (Request.Form["btnSubmit1"] != null)
        {
         //
        }
        if (Request.Form["btnSubmit2"] != null)
        {
         //
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-05
          • 1970-01-01
          • 2012-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-10
          • 1970-01-01
          相关资源
          最近更新 更多