0

在使用启用了不显眼验证的 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 validate 没有更新的原因是 NuGet 没有安装原始的 jquery validate 1.8.1 脚本。在这种情况下,NuGet 会检测到库并提供更新,但执行更新时不会替换原始脚本。NuGet 将其视为非致命警告。故事的寓意:阅读所有 NuGet 输出!

4

2 回答 2

0

我想我理解了这个问题,但可能我错过了一些东西。我使用隐藏字段来保存相关记录的 ID,并且从未使用过验证器方法。

如果您需要使用 hidden 来保存 ID,是因为您不想/不需要向用户显示该 ID 并让他更改该值......所以,不应该需要验证器。

如果此字段是必需的,并且由于用户无法输入...尝试使用 Firebug 更改您的 html 或制作帖子)。

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

于 2013-04-22T23:14:44.417 回答
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;}
}

行动方法:

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);
}
于 2013-04-23T00:02:51.823 回答