2009-08-26 75 views
3

通常,在ASP.NET MVC中,是否可以在同一个表单中放置两个不同的按钮来发布不同的控制器动作?在同一个ASP.NET MVC表单中使用2个按钮

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

回答

1

关于在浏览器中处理这方面的一些想法:

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

链接不提交表单。如果他们(通过JS) - 那么第一和第二种方法的区别在哪里? – 2009-08-26 16:59:57

+0

链接可以执行获取请求,并且您可以使用JavaScript构建URL。但是,你是对的 - 如果你需要提交表单元素,链接没有真正的好处。 – 2009-08-26 18:46:25

+0

样式链接和按钮看起来一样,最终是我去的方向。感谢您的建议! – YeahStu 2009-10-06 13:33:51

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 
     }); 
}); 
+0

请注意,这个例子是使用jQuery ...一个很好的选择IMO。 – 2009-08-27 02:15:55

0

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

0

那么有几种方法可以处理这个问题。假设你没有使用按钮单击发送数据,我会使用选项3.如果必须包含数据,请考虑选项1和某种临时数据存储(如TempData)。

  1. 一种形式职位上提交一个控制器 动作和控制器 动作检查哪个按钮被点击 ,然后调度 RedirectToAction()。 (不很大)
  2. 在一个页面上张贴到多个控制器动作(更好)
  3. 内部或形式之外创建一个input type="button",并给它一个onclick处理 用户重定向到一个控制器动作多种形式(最佳)
+0

重定向不会保留传递的数据。您必须将数据存储在TempData中才能保留它。 – tvanfosson 2009-08-26 15:23:36

+0

好点tvan。 – 2009-08-26 15:27:13

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参数。

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

另一种方法发生:具有在相同的形式两个按钮,指向一个控制器动作,即然后决定(基于按钮的值点击)重定向到哪个动作。

+0

#1 - 很可能这些按钮需要提交相同的数据,所以它不起作用。 #2感觉尴尬 - 不是吗? :) – 2009-08-26 17:02:33

+0

@Amis - 这一切都感觉有点尴尬:p但是,如果他们提交相同的数据,唯一的区别是如何处理它,那么对我来说,这听起来像是用不同的开关同样的方法。 TBH,这很可能会用于确定/取消按钮,其中取消不需要提交任何数据。 – 2009-08-26 21:35:43

0

它不是必要的JavaScript ...

这个怎么样

公众的ActionResult DoSomething的()
{
          //一些业务逻辑
          TempData [“PostedF ormValues“] = Request.Form;
         如果(的Request.Form( “按钮a”)!= NULL)
          {
               返回RedirectToAction( “ActionA”,RouteData.Values) ;
         }
         返回RedirectToAction( “ActionB”,RouteData.Values);
}

1

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

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

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

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

例如,您有两个按钮:ButtonA,ButtonB并且想要对每个按钮执行不同的 操作。 简单的办法是:只要使用BeginForm声明:

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

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

您还必须声明按钮a,ButtonB行动,您的主页控制器:

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

[HttpPost] 
public ActionResult ButtonB() 
{ . . . } 
相关问题