好的,我有一个看起来像这样的ViewModel:
public class UserLogin
{
[Required]
public string EmailAddress { get; set; }
[Required]
public string Password { get; set; }
}
我的控制器看起来像这样:
[HttpPost]
public ActionResult LogIn(UserLogin model)
{
if (!ModelState.IsValid)
{
// ...
}
}
我的观点如下:
<% Html.BeginForm("Join", "User", FormMethod.Post); %>
<%= Html.Hidden("ReturnUrl", Request.Url.AbsolutePath) %>
<%= Html.TextBoxFor(c => c.EmailAddress, new { id = "join-emailaddress", @class = "text", uiHintText = "Email address" })%>
<%= Html.ValidationMessageFor(c => c.EmailAddress, "*") %>
<%= Html.PasswordFor(c => c.Password, new { id = "join-password", @class = "text", uiHintText = "Password" })%>
<%= Html.ValidationMessageFor(c => c.Password, "*")%>
<%= Html.PasswordFor(c => c.PasswordConfirm, new { id = "join-password-confirm", @class = "text", uiHintText = "Password (repeat)" })%>
<%= Html.ValidationMessageFor(c => c.PasswordConfirm, "*")%>
<input type="submit" value="Sign me up!" class="submit" />
<% Html.EndForm(); %>
如果我发布没有在任何字段中输入任何字段的表单,我会一直为'ModelState.IsValid'获得'true'的值。
不应该是“假”,因为我已将这些字段标记为“必填”而未输入任何值?
答案 0 :(得分:2)
查看最新的RC for ASP.NET MVC。它包含了一些修复方法。
http://haacked.com/archive/2010/02/04/aspnetmvc2-rc2.aspx
具体来说,从发行说明:
默认验证系统验证整个模型
默认值 ASP.NET MVC 1.0中的验证系统 并在之前的ASP.NET MVC 2预览中 到RC 2仅验证模型 发布到的属性 服务器。在ASP.NET MVC 2 RC2中,新的 行为是所有模型属性 在模型时验证 验证,无论是否是新的 价值已发布。
有关此更改的更多信息,请参阅Brad Wilson博客上的以下帖子:
ASP.NET MVC中的输入验证与模型验证
http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html
答案 1 :(得分:1)
我之前遇到过同样的问题,但我使用的是ASP.NET MVC1。 但是我通过在Global.asax.vb文件中添加以下代码来解决问题。
Sub Application_Start()
RegisterRoutes(RouteTable.Routes)
'Added following line
ModelBinders.Binders.DefaultBinder = New Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder()
End Sub
您需要导入Microsoft.Web.Mvc.DataAnnotations.dll。您可以从http://aspnet.codeplex.com/releases/view/24471
获取答案 2 :(得分:1)
我找出了我特定问题的原因。
在我的ViewModel属性上使用[Required]属性时,我已为错误指定了资源类型和资源名称。
示例:
[Required(ErrorMessageResourceName = "FirstNameError",
ErrorMessageResourceType = typeof(MyResourceFile))]
public string FirstName { get; set; }
但是我忽略了将FirstNameError资源设为'public';它仍然标记为“内部”,因此无法访问。
将其设置为public后,一切正常,ModelState.IsValid包含正确的值。
我很惊讶没有出现任何错误而且这种情况无声地失败了,但现在我知道为什么了。
(是的,我应该从一开始就提到我正在使用资源。我错误地认为这是无关紧要的,但事实证明它非常相关。)