Html.ValidationMessage在所有字段上呈现,无论它们是否有效

时间:2010-12-17 19:49:12

标签: asp.net asp.net-mvc

我的模型已正确验证。如果我在调试期间在验证结果中达到峰值,我会发现一切都是正确的。但是,所有我的验证结果都会显示,即使只有一个无效。同样,在调试期间,验证结果中只有一个字段正确显示,但是当我的视图呈现时,我们显示了所有字段:

[HttpPost]
public ActionResult Create(Widget widget)
{
      if (widge.Valid) 
      {
      // Save to db
      }

      retun View(widget);
}

我的观点:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" Inherits="System.Web.Mvc.ViewPage<Widget>" %>
// took out a lot of html here
<form action="Create" method="post">
<input name="Widget.City" value="<%= Model.City == null ? "" : Model.City%>" />
<%= Html.ValidationMessage("Widget.City")%>
<input name="Widget.Department" value="<%= Model.Department == null ? "" : Model.Department %>" />
<%= Html.ValidationMessage("Widget.Department")%>
<button type="submit">Save</button>
</form>

让我们说我的模型中的城市和部门设置为NotNull,我正确地放入城市,但将部门留空。再次,它将显示它在控制器上无效,属性部门有问题,但在我看来,我将得到两个属性的“可能不为空”消息。如果我在视图中有4个属性和4个ValidationMessage标记,即使一个属性无效...所有4都将显示。这是什么交易?

2 个答案:

答案 0 :(得分:0)

如果我没弄错,我想你想要使用

Html.ValidationMessageFor(model => model.City)

不是您目前在视图中使用的内容。

此外...由于您使用的是强类型视图,因此您应该检查ModelState.IsValid以确定是否应该保存Widget。也就是说,如果您在视图模型上使用数据注释。

答案 1 :(得分:0)

您使用什么作为视图的[HttpGet]操作的输入?

由于您使用格式Widget.Property,视图需要模型具有包含窗口小部件数据的窗口小部件属性..即它正在查找Model.Widget.Property,但您的模型仅包含{{ 1}}。根据此处发布的代码,您只是将窗口小部件传递回视图,它会将其解释为具有NULL Model.Property属性,从而触发所有NotNull验证。

此处的解决方案是将Widget post模型(您在Widget操作中接受的内容)分配给您传递回视图的模型的Widget属性。

[HttpPost]

希望我能正确地表达出来......这是漫长的一天=)