在同一个ASP.NET MVC表单中使用2个按钮

时间:2009-08-26 15:10:13

标签: html asp.net-mvc

一般情况下,是否可以在同一表单中使用两个不同的按钮发布到ASP.NET MVC中的不同控制器操作?

我基本上试图在同一个表单中有两个输入(type =“button”)标签,但我希望它们执行不同的控制器操作。我想在一些情况下这样做,因为我认为它提供了一个良好的美学,能够点击按钮而不是超链接。有没有办法做到这一点,还是应该以不同的方式设计?

9 个答案:

答案 0 :(得分:9)

不使用Javascript真的不可能。使用Javascript,您只需定义调用正确操作的不同点击处理程序。

 $(function() {
      $('#button1').click( function() {
          $(form).attr( 'action', '<% Url.Action( "action1" ) %>' )
                 .submit();
          return false; // prevent default submission
      });
      $('#button2').click( function() {
           $(form).attr( 'action', '<% Url.Action( "action2" ) %>' )
                 .submit();
          return false; // prevent default submission
      });
}); 

答案 1 :(得分:1)

关于在浏览器中处理此问题的一些想法:

  • 您可以使用样式看起来像按钮的链接。这很容易做到,无论是图像还是将链接放在带边框的块元素中。
  • 您可以使用两个不直接提交的按钮;他们改为调用一个javascript函数,在提交之前设置表单操作。

答案 2 :(得分:1)

如果你想要的就是OK&amp;取消按钮,然后查看this post by David Findley

我在编辑视图中使用此方法,其中我有一个编辑按钮和一个删除按钮。删除按钮仅需要项目的ID。在下面的代码中,您可以看到我已将我的属性命名为“AcceptFormValueAttribute”。这种方法对我有好处,因为我的删除[Get]操作只显示要求确认的消息,因此需要重定向。

    [ActionName("Edit")]
    [AcceptFormValue(Name = "Action", Value = "Delete")]
    [AcceptVerbs(HttpVerbs.Post)]
    [ValidateAntiForgeryToken]
    public ActionResult EditDelete(int? id)
    {
        return RedirectToAction("Delete", new { id = id });
    }

答案 3 :(得分:0)

这与ASP.NET MVC无关,但与html无关。我看到你如何做到这一点的唯一方法是通过检查提交表单时使用javascript修改表单标签的action属性,方法是检查按下了哪个按钮。

答案 4 :(得分:0)

有几种方法可以解决这个问题。假设您没有使用按钮发送数据,请单击“我选择3”。如果必须包含数据,则考虑使用某种临时数据存储(如TempData)的选项1。

  1. 一个表单发布到一个控制器 提交和控制器的行动 动作检查哪个按钮是 点击然后发送一个 RedirectToAction()。 (不太好)
  2. 一个页面上的多个表单发布到多个控制器操作(更好)
  3. 在表单内部或外部创建input type="button"并为其提供onclick处理程序 将用户重定向到控制器操作(最佳)

答案 5 :(得分:0)

没有试过这个,但是如果点击按钮的ID确实是通过http POST发送的,你可以做类似的事情:

<input type="submit" name="GO" ID="GO" value="GO BUTTON" />
<input type="submit" name="STOP" ID="STOP" value="STOP BUTTON" />

然后在mvc端,只有两个方法,一个带go参数,一个带stop参数。

答案 6 :(得分:0)

方法#1

如何使用两个不同的表单包装按钮,然后使用CSS定位其中一个,以便它(在视觉上)显示在“主”表单内?

一个非常简单的例子:

<fieldset id="CombinedForm">

<form ... action="Method1">
  ...form stuff here...
  <input id="Button1" type="submit" value="Do something">
</form>

<form ... action="Method2">
  ...form stuff here...
  <input id="Button2" type="submit" value="Do something else">
</form>

</fieldset>

...然后使用CSS如下:

#CombinedForm {
  position: relative;
  padding-bottom: 2em; /* leave space for buttons */
}

#Button1, #Button2 {
  position: absolute;
  bottom: 0;
}

#Button1 {
  left: 0;
}

#Button2 {
  right: 0;
}

结果应该是你有一个fieldsetdiv看起来像一个表单,里面有两个实际的HTML表单,两个按钮位于父框内,但仍然提交给不同的地点。

方法#2

另一种方法是:让两个按钮处于相同的形式,指向一个控制器动作,然后决定(根据点击按钮的值)重定向到哪个动作。

答案 7 :(得分:0)

不需要Javascript ......

这个怎么样

  

public ActionResult DoSomething()
  {
  //一些业务逻辑
  TempData [“PostedFormValues”] = Request.Form;
  if(Request.Form(“ButtonA”)!= null)
  {
  返回RedirectToAction(“ActionA”,RouteData.Values);
  }
  返回RedirectToAction(“ActionB”,RouteData.Values);
  }

答案 8 :(得分:0)

我认为我可以提出更简单的建议。

例如,您有两个按钮:ButtonA,ButtonB,并希望执行不同的操作 对每一个采取行动。 最简单的解决方案是:只使用BeginForm语句:

@using ( Html.BeginForm("ButtonA" , "Home") )
{
        <input type="submit" value="ButtonA"/>
}

@using ( Html.BeginForm("ButtonB" , "Home") )
{
        <input type="submit" value="ButtonB" />
}

您还必须在家庭控制器中声明ButtonA,ButtonB操作:

[HttpPost]
public ActionResult ButtonA()
{ . . . }

[HttpPost]
public ActionResult ButtonB()
{ . . . }