【问题标题】:How are Validation Messages transmitted from controller to view?验证消息如何从控制器传输到视图?
【发布时间】:2014-04-09 08:05:51
【问题描述】:

我需要修改网站上的验证消息。原因是(也许是坏的)我们走捷径。我们将编写一个自定义 ModelBinder。不过,我会暴露我的问题。

在视图文件中,我们添加了几个隐藏输入字段,并使用模型绑定器,在控制器中,我们得到了两个实体(一个是视图文件的模型,另一个是通过隐藏输入字段创建的)

<input type="text"   name = "FromHiddenInputs.Name" value="" />
<input type="hidden" name ="FromHiddenInputs.Id" value="0" />

请注意,FromHiddenInputs 不是我的@Model 的一部分。

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Entity MyModel, SecondEntity FromHiddenInputs)
{
    if (ModelState.IsValid){

在处理我的表单发布结果的方法上处于调试模式。当我查看 ModelState 时,我看到两个实体都有一些验证错误。

所以在视图文件中,使用这段代码,我可以显示我的验证消息:

@Html.ValidationMessageFor(model => model.MyProperty)

@Html.ValidationMessage("FromHiddenInputs.Name", "*")

所以我的问题如下,ModelState 的这个 Errors 和 Validation 是如何从 ActionResult 传递到 viewfile 的?

【问题讨论】:

    标签: c# entity-framework asp.net-mvc-4 razor


    【解决方案1】:

    由于ModelBinder早先执行了验证过程,因此ModelState.Values中已经存在错误数据。

    现在ValidationMessageFor 辅助方法所要做的就是从它的ViewData.ModelState.Values 集合中提取数据。

    【讨论】:

      【解决方案2】:

      模型验证消息是从模型属性生成的,由 jquery unobtrusive validation 生成,没有完整的回发,但如果你不包含它,则完成完整的回发并由 jquery 生成消息验证 js文件。

      jquery unobtrusive-validate.js 中有一个 onError 方法,当出现验证错误时会调用该方法,它会检查每个元素并从模型属性生成错误消息并使其可见。

      这是 jquery-unobtrusive-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();
              }
          }
      

      【讨论】:

      • OP 在哪里提到了 jQuery?
      • 但验证是通过 jquery 在 asp.net mvc 中完成的
      • 这是可选的,仅在客户端。 OP 在这里谈论服务器端。
      • 但大多数时候我们进行不显眼的验证,没有人愿意为验证做回发
      • 你可以,在客户端。但在提交时,也会在服务器端执行验证。
      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多