我在ASP.NET MVC(v1)中有一个有两个输入按钮的表单。每个提交按钮都必须包含在这个单一的表单中,我需要知道用户按下了哪一个。
我知道检查FormCollection值的技巧,该值将根据按下的按钮返回。例如,如果我有和用户单击Button2,我应该可以说Request.Form [“Button2”]!= null并且将评估为true,在这种情况下,我知道用户单击了该按钮。
然而,这对我不起作用。我的所有按钮的值都为null,因为它们中的不包含在Request.Form值中。 ASP.NET MVC中是否存在吞下这些值的错误?
这是我的表单代码:
<% using (Html.BeginForm()) {%>
<% Html.RenderPartial( "EditAreaControl", Model ); %>
<div class="form-layout-command-container">
<div class="form-layout-command-area-alpha"><button type="submit" name="submit1" value="Save">Save</button></div>
<div class="form-layout-command-area-alpha"><button type="submit" name="submit2" value="SaveAndCopy">Save and Create Copy</button></div>
<div class="form-layout-command-area-beta"><%= Html.ActionLink("Cancel", "list") %></div>
</div>
<% } %>
这是我的控制器代码:
[AcceptVerbs( HttpVerbs.Post )]
public ActionResult Add(FormCollection values )
{
if (values["submit1"] != null)
// always false
if (values["submit2"] != null)
// always false as well
}
答案 0 :(得分:6)
来自w3schools:
重要提示:如果您在HTML表单中使用button元素,则不同的浏览器会提交不同的值。 Internet Explorer将在和标签之间提交文本,而其他浏览器则会提交值属性。使用input元素以HTML格式创建按钮。
似乎这不是标准化的。你应该坚持
<input type="submit" name="submitButton" value="Save" />
<input type="submit" name="submitButton" value="Cancel" />
答案 1 :(得分:2)
我会使用提交类型的输入而不是按钮。非输入可能不会在表单中传回,或者至少可以不一致地传回。请注意,它们可以具有不同值的相同名称,以便您可以对提交表单的任何按钮使用相同的参数。
<input type="submit" name="submitButton" value="Save" />
<input type="submit" name="submitButton" value="SaveAndCopy" />
public ActionResult Save( string submitButton, ... )
{
if (submitButton == "Save")
{
...
}
else if (submitButton == "SaveAndCopy")
{
...
}
....
}
答案 2 :(得分:1)
使用Firebug,我发现提交按钮没有在响应中发送,因此,在MVC方面我无能为力。我决定使用客户端黑客来填充客户端的隐藏输入字段,该输入字段将传递给控制器值。
我将输入按钮更改为:
<input type="submit" value="Save" onclick="actions.copyValues($(this), $('#submitAction'));" />
<input type="submit" value="Save and Copy" onclick="actions.copyValues($(this), $('#submitAction'));" />
<input type="hidden" id="submitAction" name="submitAction" />
jquery脚本只是复制值:
Actions.prototype.copyValues = function(from, to) {
$(to).val($(from).val());
};
然后,控制器操作会查找隐藏的输入值:
var request = HttpContext.Request;
return request.Form["submitAction"];
这解决了上面的问题但我意识到它不是那么干净。
答案 3 :(得分:0)
将它们分成两种不同的形式,您将根据控制器上调用的操作知道提交了哪一种。