在ASP.NET MVC post上未检测到提交按钮

在ASP.NET MVC post上未检测到提交按钮,asp.net,asp.net-mvc,forms,Asp.net,Asp.net Mvc,Forms,我正在开发一个ASP.NET MVC表单,它需要多个提交按钮。我读过半打左右关于提交按钮标识的帖子,但我甚至无法检测到表单帖子上的提交按钮。按钮是命名的,所以我希望它们至少会显示在发布的元素中 经过多次尝试和错误,我的表格目前定义如下: @using (Html.BeginForm("LineItems", "Loan", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { // Several o

我正在开发一个ASP.NET MVC表单,它需要多个提交按钮。我读过半打左右关于提交按钮标识的帖子,但我甚至无法检测到表单帖子上的提交按钮。按钮是命名的,所以我希望它们至少会显示在发布的元素中

经过多次尝试和错误,我的表格目前定义如下:

@using (Html.BeginForm("LineItems", "Loan", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    // Several omitted fields.

    <input type="submit" id="Command" name="Command" value="Save" class="btn btn-primary btn-sm" />
    <input type="submit" id="Command" name="Command" value="Confirm Budget" class="btn btn-sm btn-success" />

}
我在ModelState.IsValid行上放置了一个断点,然后开始在调试器中检查。这是我看过的几块手表。 Request.Params.allkey Request.Form.allkey

提交按钮在这两个窗口中都没有显示。另外,您会注意到我在ActionResult的参数中插入了string命令。它只返回NULL。我已经更改了这些按钮的名称和ID好几次,但仍然找不到它们

在即时窗口中,返回null:Request.Form[“Command”]

这个按钮会出现在表格的哪个位置?如果它不在Request.Form.allkey中,它会在哪里

还有一件事需要提及,这个表单成功地保存了我正在使用的数据。我们刚刚添加了另一个按钮,因为当选择第二个按钮时,我们需要对表单元素执行不同的操作,因此我需要检测submit按钮

虽然我已经处理了很多传统的ASP和Web表单,但我对MVC不太精通。因此,如果这是一个重复的问题,我提前表示歉意

这是我读过的众多帖子中的一些,但我一直无法解决这个问题

谢谢你的帮助

===编辑2015年4月24日下午2:46中环===

谢谢大家的建议。正如Huy Hoang Pham在fiddle中所展示的(感谢您的写作),我采用的模式应该是可行的。我尝试了其他几个建议来让它运行起来,但都失败了。我怀疑我正在使用的表单中可能有更大的缺陷。这是一个动态表单,用户可以通过javascript添加行。虽然我无权发布整个表格

无论如何,我已经编写了一个解决方案,可以告诉我按下了什么按钮,尽管这并不漂亮。在这里,但一定有更好的办法

首先,我在模型中添加了以下内容:

public string ButtonSelected { get; set; }
在视图中,我将其放入代码块中以获取字段名

var hiddenButtonSelectedFieldID = Html.IdFor(m => m.ButtonSelected);
下面,我将这个脚本放到视图中

<script>
    $(function () {
        $('.submissionButton').on('click', function () {
            var buttonId = $(this).prop("id");
            $('#@hiddenButtonSelectedFieldID').val(buttonId);
        });
    });
</script>

$(函数(){
$('.submissionButton')。在('click',函数(){
var buttonId=$(this.prop(“id”);
$('#@hiddenButtonSelectedFieldID').val(buttonId);
});
});
我在表单按钮上方添加了这个新的隐藏字段

@Html.HiddenFor(m => m.ButtonSelected, new { @Value = "Save" })
<input type="submit" id="btnSave" name="btnSave" value="Save" class="btn btn-primary btn-sm submissionButton" />
<input type="submit" id="btnConfirmBudget" name="btnConfirm" value="Confirm Budget" class="btn btn-sm btn-success submissionButton" />
@Html.HiddenFor(m=>m.ButtonSelected,new{@Value=“Save”})
发布表单后,将成功返回“我的模型”中的选定按钮。模型的ButtonSelected属性将根据我单击的内容具有“btnSave”或“btnConfirmBudget”。如果我通过Enter键单击,它也可以工作。就我个人而言,我不喜欢这种变通方法。它很脆弱,具有JavaScript依赖性,而且感觉非常粗糙。但我必须实事求是,让这一部分运作起来,继续这个项目

我愿意尝试其他方法,但可能无法立即作出回应。再次感谢你的帮助

==编辑日期:2015年4月29日===

好吧,我不能结束这个问题。在一次重新创建一个表单元素之后,从提交按钮开始,我能够成功地识别所选的提交按钮,直到我添加了一个具有自定义远程验证程序的表单元素。添加该元素后,submitted按钮返回null。如果我在模型中禁用了自定义验证器,我就能够识别按钮。因此,我删除了前面的JavaScript变通代码,并从模型中删除了远程验证器数据注释。之前,我已经编写了代码来验证控制器操作中的表单元素,以及一个额外的回退。所以我只是在运行服务器端验证例程。如果时间允许,我可以将这些发现的细节作为另一个SO问题发布。一定是我忽略了某些东西,或者在使用自定义远程验证器时实现不正确


版主可以随意关闭此页面。谢谢。

除了两个元素具有相同的id外,您的代码看起来是合法的。 尝试将视图和操作中的“命令”名称更改为其他名称(“btnName”或其他名称)

尝试将
更改为
,我不确定它们可能会有不同的工作方式

最好还是仔细看看正在发布的内容。您可以使用浏览器中的开发人员工具查看post请求。 如果操作后重定向到某个地方,请记住在浏览器开发人员工具中启用保留请求历史记录

或者您可以使用fiddler跟踪请求

无论如何,它应该给你一个想法。
从我的经验来看,任何时候你发布的东西在绑定后都不会出现在动作参数中,这是因为名称不匹配。检查打字错误。(:

为什么不使用收音机而不是两个按钮?您所显示的应该可以正常工作。参数
string命令
应该是“Save”或“Confirm Budget”。参数
name
需要相同,但我建议您删除
id
属性(重复的
id的
无效,而且似乎没有必要拥有它们)它似乎在这种情况下工作得很好:我能想到的唯一原因是你实际上是在使用ajax提交它?也许可以尝试将名称“Command”改成其他名称。它可能是某个地方的保留字,导致它被忽略……也许?
@Html.HiddenFor(m => m.ButtonSelected, new { @Value = "Save" })
<input type="submit" id="btnSave" name="btnSave" value="Save" class="btn btn-primary btn-sm submissionButton" />
<input type="submit" id="btnConfirmBudget" name="btnConfirm" value="Confirm Budget" class="btn btn-sm btn-success submissionButton" />