验证消息是如何从控制器传输到视图的
本文关键字:传输 视图 控制器 消息 验证 | 更新日期: 2023-09-27 17:57:28
我需要修改网站上的验证消息。原因是(也许是糟糕的)我们走了一条捷径。我们将对自定义ModelBinder进行编码。尽管如此,我还是会揭露我的问题。
在视图文件中,我们添加了几个隐藏的输入字段,并使用模型绑定器,在控制器中,我们获得了两个实体(一个是视图文件的模型,另一个是通过隐藏输入字段创建的)
<input type="text" name = "FromHiddenInputs.Name" value="" />
<input type="hidden" name ="FromHiddenInputs.Id" value="0" />
请注意,FromHiddenInput不是我的@Model的一部分。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Entity MyModel, SecondEntity FromHiddenInputs)
{
if (ModelState.IsValid){
在调试模式下,在处理表单发布结果的方法上。当我查看ModelState时,我看到两个实体都有一些验证错误。
因此,在视图文件中,使用此代码,我可以显示我的验证消息:
@Html.ValidationMessageFor(model => model.MyProperty)
或
@Html.ValidationMessage("FromHiddenInputs.Name", "*")
所以我的问题是,如何将ModelState的错误和验证从ActionResult传递到视图文件
由于验证过程由ModelBinder
提前执行,因此错误数据已存在于ModelState.Values
中。
现在,ValidationMessageFor
助手方法所要做的就是从它的ViewData.ModelState.Values
集合中提取数据。
模型验证消息是从模型属性生成的,由jquery不引人注目的验证生成,没有完全回发,但如果不包括它,则完成完全回发并由jquery validatejs文件生成消息。
在jquery-nob唐突validate.js中,有一个方法onError,当出现验证错误时会调用它,它会检查每个元素,并从Model Property中生成错误消息,并使其可见。
下面是jquery unsobstruct validate.js中的方法,它被称为:
function onError(error, inputElement) { // 'this' is the form element
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
replace = $.parseJSON(container.attr("data-valmsg-replace")) !== false;
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
if (replace) {
container.empty();
error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
}