gpt4 book ai didi

asp.net-mvc - MVC 3 远程验证表单按钮不包含在 POST 数据中

转载 作者:行者123 更新时间:2023-12-02 08:42:18 27 4
gpt4 key购买 nike

我有一个 ASP.NET MVC3 应用程序,并对我的模型类之一进行远程验证。我发现如果我在提交表单之前打开该模型的编辑 View 并且调用远程验证例程IS NOT(由于没有编辑带有远程验证的字段),则单击按钮以发布发送到 Action 方法的请求数据中不包含表单IS

如果在 POST 表单之前调用远程验证例程 IS - 单击按钮以提交 POST 中包含的表单 IS

我需要知道在服务器上调用操作时单击了哪个按钮,以便确定用户是否单击了“更新”或“取消”。

如果我从模型中删除远程验证,则表单每次都会正确提交。

当表单提交之前未调用远程验证时,为什么用于提交表单的按钮会从表单发布中排除。

谢谢迈克尔

这里是一些示例代码:

@model Channel
<script src="@Url.Content("~/Scripts/jquery-1.6.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
<fieldset>
<legend>Edit Channel</legend>

@Html.HiddenFor(model => model.ChannelGUID)


<div class="editor-label">Name</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>

<div class="editor-label">Description</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description)
@Html.ValidationMessageFor(model => model.Description)
</div>

<div class="editor-label">Channel Code</div>
<div class="editor-field">
@Html.EditorFor(model => model.Code)
@Html.ValidationMessageFor(model => model.Code)
</div>

<p>
<button type="submit" name="updateCommand" value="Update">Update</button>
<button type="submit" class="cancel">Cancel</button>
</p>
</fieldset>
}

这是操作

[HttpPost]
public ActionResult Edit(string updateCommand, Channel channel)
{
if (updateCommand != null)
{
//update clicked
}
else
{
//cancel clicked
}

这是模型属性代码上的远程属性

[Remote("IsChannelCodeUnique", "Channel", AdditionalFields = "ChannelGUID", ErrorMessage = "code must be unique")]

最佳答案

我遇到了同样的问题。我向具有两个提交输入的表单添加了远程验证,并且所单击的提交按钮的值并不总是再发布。

虽然其他答案提供了解决方法,但我更深入地研究了它,并将回答您提出的实际问题:“为什么在远程验证时,用于提交表单的按钮会从表单发布中排除在表单提交之前不会调用。”

我知道 Javascript Submit does not include the Submit Button Value 。因此,我尝试在禁用 JavaScript 的情况下发帖。验证不起作用,但我提交的值已发布。我假设 jquery.validate.js 跳入并发送编程提交。情况确实如此。这是使用 jquery.validate.js 1.9.0 未压缩时发生的情况:

  1. 加载页面后,第 942 行验证器将使用远程方法进行扩展,并在第 735 行使用stopRequest原型(prototype)进行扩展。
  2. 当输入字段第一次失去焦点、之后输入内容或提交表单时,就会发生验证。
  3. 验证后,将调用 stopRequest 方法。
  4. 当单击提交输入时,提交会以某种方式被抑制。第 56 行有一条语句 event.preventDefault();,但这仅在 Debug模式下调用。无论如何,当单击提交并执行远程验证后,将调用 stopRequest 方法。
  5. 当表单有效时,第742行被调用:$(this.currentForm).submit();,这是一个程序化提交,不会发布提交的值。这就是为什么我无法确定单击了哪个提交按钮。

更仔细地观察验证的扩展方式,我在第 59 行发现了一个处理程序的定义,该定义似乎旨在克服一些类似的问题:它添加了一个隐藏输入,其中包含提交按钮的名称和值它处理。但是,在我的例子中,validator.settings.submitHandler 和 validator.submitButton 均未定义,因此永远不会调用此代码。

如果在这种情况下也添加这个隐藏字段,那就太好了,因为 MVC 不知道也不关心发布该值的输入类型,并且 Controller 上的后操作可以仅使用该值。

添加我解决该问题的方法是将处理程序添加到提交的点击函数中:

$('input[type="submit"]').click(function () {
var hidden = $("<input type='hidden'/>").attr("name", this.name).val(this.value).appendTo($(this).closest("form"));
});

隐藏字段已创建,因此我不必依赖具有正确名称的隐藏字段。您可以为提交指定相同的名称并测试值,也可以为提交指定不同的名称并测试是否存在 post 参数。当然,您还需要使用尚未使用的表单字段名称。

关于asp.net-mvc - MVC 3 远程验证表单按钮不包含在 POST 数据中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6386724/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com