在ASP.NET MVC帖子

时间:2015-04-24 02:30:25

标签: asp.net asp.net-mvc forms

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

经过大量的反复试验后,我的表格目前定义如下:

@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" />

}

是的,这些按钮目前在绝望中被命名为同样的东西,试图至少检测一个名为“Command”的已发布表单元素。

我的ActionResult看起来像这样。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LineItems(LineItemsModel model, string Command)
{
    //var button = Request.Params.AllKeys.FirstOrDefault(key => key.StartsWith("btnSave"));
    //var errors = ModelState.Where(x => x.Value.Errors.Count > 0).Select(x => new { x.Key, x.Value.Errors }).ToArray();
    if (ModelState.IsValid)
    {
        // Save code omitted...
    }
    return View(model);
}

我在该ModelState.IsValid行上设置断点,然后在调试器中开始检查。这是我评论过的几款手表。 Request.Params.AllKeys Request.Form.AllKeys

提交按钮不会显示在其中任何一个中。另外,你会注意到我在ActionResult的参数中卡住了字符串Command。那只是返回NULL。我已经多次更改了这些按钮的名称和ID,但仍然无法找到它们。

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

该表单上的按钮会显示在哪里?如果它不在Request.Form.AllKeys中,它会在哪里?

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

虽然我已经用旧学校的经典ASP和Web表格处理了很多,但我对MVC不太熟练。如果这是一个重复或一个菜鸟问题,我提前道歉。

这些是我读过的很多SO帖子中的一小部分,但我一直无法解决这个问题。

感谢您的帮助。

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

感谢大家的建议。正如Huy Hoang Pham在小提琴中表现出来的那样(感谢写作),我所采用的模式应该有效。我已经尝试了其他一些建议来实现这一功能,但它们都失败了。我怀疑在我正在使用的形式中可能存在更多缺陷。这是一个动态表单,用户可以通过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>

我在表单按钮上方添加了这个新的隐藏字段。

@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" />

发布表单后,这会成功返回模型中的所选按钮。模型的ButtonSelected属性将具有“btnSave”或“btnConfirmBudget”,具体取决于我单击的内容。如果我通过Enter键单击它也可以。就个人而言,我不喜欢这种解决方法。它很脆弱,具有JavaScript依赖性,并且感觉非常hacky。但我必须务实,让这件作品继续进行这个项目。

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

===编辑4/29/2015 ===

好吧,我无法关闭这个问题。在从提交按钮开始一次重新创建表单元素之后,我能够成功识别所选的提交按钮,直到我添加了具有自定义远程验证器的表单元素。添加该元素后,提交的按钮返回null。如果我在模型中禁用了自定义验证器,我就能够识别该按钮。因此,我删除了以前的JavaScript解决方法代码,并从模型中删除了远程验证器数据注释。以前我编写过代码来验证控制器操作中的这个表单元素,作为额外的后备。所以我只是运行该服务器端验证例程。如果时间允许,我可以将这些发现的详细信息作为另一个SO问题发布。必须有一些我忽略或使用该自定义远程验证器错误实现的东西。

主持人可以随意关闭此内容。感谢。

1 个答案:

答案 0 :(得分:0)

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

尝试将<input>更改为<button type="submit">他们可能会有不同的工作方式,我不确定。

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

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

无论如何它应该给你一个想法。 根据我的经验 - 任何时候发布的东西,并且它在绑定后没有出现在动作参数中是因为名称不匹配。检查拼写错误。 ( - :