验证消息是如何从控制器传输到视图的

本文关键字:传输 视图 控制器 消息 验证 | 更新日期: 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();
        }
    }