验证不工作的视图模型

问题描述:

好吧,我有一个视图模型,看起来像这样:验证不工作的视图模型

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'的值。

它不应该是'假',因为我已经将这些字段标记为'必需'并且没有输入任何值?

查看最新的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

+0

我升级到ASP.NET MVC 2 RC 2 ,但我仍然有完全相同的问题。似乎升级改变了一件事情。 – Jonathan 2010-02-14 12:21:23

+0

我认为它现在已经修复了,但是一个奇怪的修复...在@ H_Sampat的回答下查看我的评论。 – Jonathan 2010-02-14 12:41:33

我有同样的问题较早,但我使用的是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

+0

已修复!我将下面的语句添加到Application_Start函数中:ModelBinders.Binders.DefaultBinder = new System.Web.Mvc.DefaultModelBinder();.我想知道为什么这将是必要的。当我有时间的时候,我会再看看它。 – Jonathan 2010-02-14 12:42:44

+0

呃..我错了。第二次运行这个项目,它又回到给我一个'ModelState.IsValid'的'真实'...我必须再次检查我所做的所有更改,并找出它为什么会破坏... – Jonathan 2010-02-14 13:18:50

我想出了我的特定问题的原因。

在我的ViewModel属性上使用[必需的]属性时,我指定了错误的资源类型和资源名称。

例子:

[Required(ErrorMessageResourceName = "FirstNameError", 
      ErrorMessageResourceType = typeof(MyResourceFile))] 
public string FirstName { get; set; } 

但是我会忽略了将FirstNameError资源 '公共';它仍然被标记为“内部”,因此无法访问。

将它设置为公共状态后,一切正常,ModelState.IsValid包含正确的值。

我很惊讶没有错误发生,这失败了默默,但现在我知道为什么。

(是的,我应该从我所用的资源开始时提到,让我误以为这是无关紧要的,但它被证明是非常相关的。)

+0

Make如果你认为这是一个善意的错误,那么你肯定让菲尔·哈克知道这件事。 http://haacked.com/contact.aspx。很高兴能够进入最终版本。 – 2010-02-15 01:51:20

+0

好主意!我给菲尔发了一条消息。 – Jonathan 2010-02-17 02:48:29