ASP.NET MVC是否吞下提交值?

时间:2009-11-13 21:36:55

标签: c# asp.net-mvc

我在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
}

4 个答案:

答案 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)

将它们分成两种不同的形式,您将根据控制器上调用的操作知道提交了哪一种。