使用MVC4 Razor网站进行隐藏字段的Javascript验证错误,具有不显眼的验证

时间:2013-04-22 22:41:01

标签: 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错误,因为默认情况下隐藏字段包括不显眼的验证属性,这些属性需要相应的验证错误消息。 我意识到我可以通过手工编写字段来获取我正在寻找的html输出:

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

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

修改

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

注意

jQuery验证没有更新的原因是因为NuGet没有安装原始的jquery验证1.8.1脚本。在这种情况下,NuGet会检测库并提供更新,但是在执行更新时,不会替换原始脚本。这被NuGet视为非致命警告。故事的道德:阅读你所有的Nu​​Get输出!

2 个答案:

答案 0 :(得分:0)

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

如果您需要使用隐藏来保存ID,那是因为您不希望/需要向用户显示该ID并让他更改该值...因此,不需要验证器。< / p>

如果需要此字段,并且由于用户无法输入该字段...如果缺少此字段是意外情况,需要处理类似于异常(不公开错误的来源,因为可能是用户尝试使用Firebug或制作帖子来改变您的HTML。)

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

答案 1 :(得分:0)

你错了。

此代码完美无缺:

@model MyViewModel;

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

模型:

public class MyViewModel {
    public int HiddenId {get;set;}
    public string TextField {get;set;}
}

ActionMethods:

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);
}