使用MVC4 Razor站点的隐藏字段的Javascript验证错误,验证不引人注目

使用MVC4 Razor站点的隐藏字段的Javascript验证错误,验证不引人注目,razor,asp.net-mvc-4,jquery-validate,unobtrusive-validation,Razor,Asp.net Mvc 4,Jquery Validate,Unobtrusive Validation,在使用ASP.NET MVC并启用了不引人注目的验证时,我曾多次需要将ID作为隐藏字段嵌入到Razor表单中。我学会了始终包含验证消息,例如: @Html.HiddenFor(x => x.ParentId) @Html.ValidationMessageFor(x => x.ParentId) 如果关闭验证消息,这将在提交时触发javascript错误,因为默认情况下,隐藏字段包括不引人注目的验证属性,这些属性需要相应的验证错误消息。 我意识到我可以通过手工编码字段来获得我想要的

在使用ASP.NET MVC并启用了不引人注目的验证时,我曾多次需要将ID作为隐藏字段嵌入到Razor表单中。我学会了始终包含验证消息,例如:

@Html.HiddenFor(x => x.ParentId)
@Html.ValidationMessageFor(x => x.ParentId)
如果关闭验证消息,这将在提交时触发javascript错误,因为默认情况下,隐藏字段包括不引人注目的验证属性,这些属性需要相应的验证错误消息。 我意识到我可以通过手工编码字段来获得我想要的html输出:

<input data-val="false" id="ParentId" name="ParentId" type="hidden" value="@Model.ParentId" />

但是如果采用这种方法,我将失去使用
InputExtensions.HiddenFor
helper方法的好处。有没有什么方法可以简单地使用扩展方法而不产生JavaScript错误

编辑:

这是一个jquery验证问题。我的jquery验证脚本在版本1.8.1上卡住了(请参见下面的注释)。我手动更新到jquery.validate 1.11.1,问题消失了

注:


jQuery验证没有更新的原因是NuGet没有安装原始的jQuery验证1.8.1脚本。在这个场景中,NuGet检测库并提供更新,但是当执行更新时,原始脚本不会被替换。NuGet将此视为非致命警告。这个故事的寓意是:阅读你所有的NuGet输出

我想我理解这个问题,但可能是我遗漏了什么。 我使用隐藏字段来保存相关记录的ID,但从未使用过验证器方法

如果您需要使用隐藏来保存ID,是因为您不想/不需要向用户显示该ID并让用户更改该值。。。因此,不需要验证器

如果此字段是必需的,并且由于用户无法输入它。。。如果缺少此字段,则是一种意外情况,需要像处理异常一样进行处理(不披露错误的来源,因为可能是用户试图使用Firebug或手工制作帖子来更改html)

如果您的逻辑(JS/Razor)可以在隐藏中放置一些内容,但有时您需要在其中放置一个null,因为ID通常从1开始,您可以使用从0到负值的数字来表示null值。然后,您可以发布该值并在控制器中执行检查。如果您使用这种方法,您甚至可以使用您的验证器逻辑。

您在这方面错了

这段代码运行得非常好:

@model MyViewModel;

@using(BeginForm()) {
    @Html.HiddenFor(m => m.HiddenId)
    @Html.TextBoxFor(m => m.TextField);
    <input type="submit" />
}
行动方法:

public ActionResult Index() {
    return View(new MyViewModel { HiddenId = 1, 
                TextField = "We Don't need no steekin Validation Messages" });
}

[HttpPost]
public ActionResult Index(MyViewModel model) {
    if (ModelState.IsValid) {
         return Content("It's Valid!");
    }

    return View(model);
}

你完全错了。不要求在任何MVC字段上都有验证消息,无论是否隐藏。您在过去看到的问题可能是您实际上没有在字段中设置隐藏值,因此没有发布值。只有在隐藏属性中没有值时,属性才会触发验证错误。我的问题是InputExtensions.HiddenFor方法。我已经澄清了我的问题。不,你完全错了。不要求任何MVC字段上都有验证消息,无论是否隐藏,包括InputExtensions方法。你在这件事上完全错了。只要隐藏中有一个值,并且它不违反字段中可能存在的任何其他验证,那么它就不会生成错误。是的,我完全错了。谢谢你指出这一点。我不明白为什么旧版本会导致这个问题。旧版本应该仍然有效。不管怎样,我很高兴您修复了它。问题是,如果您使用InputExtension.HiddenFor方法,则始终需要验证消息。我想要的不是像您一样对ID使用验证器,而是对支持编辑的字段启用不引人注目的验证,并使用HiddenFor方法生成隐藏的ID字段。我已经澄清了这个问题;希望这能消除困惑。你的例子就是我用的。。。我所有的编辑视图都有一个或多个HiddenFor助手,我不使用验证器。我不敢相信我没有在一个空项目中复制它,但我没有这样做。以此为指导,我能够解开问题的根源(见更新的问题)。
public ActionResult Index() {
    return View(new MyViewModel { HiddenId = 1, 
                TextField = "We Don't need no steekin Validation Messages" });
}

[HttpPost]
public ActionResult Index(MyViewModel model) {
    if (ModelState.IsValid) {
         return Content("It's Valid!");
    }

    return View(model);
}