2010-03-18 49 views
1

现在发疯了。我有一个MVC解决方案,我已经从MVC 1升级到2.这一切都正常工作....除了验证!MVC 2数据注释问题

下面是一些代码:

在控制器:

using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Security.Principal; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Security; 
using System.Web.UI; 
using MF.Services.Authentication; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 

namespace MF.Controllers 
{ 
    //basic viewmodel 
    public class LogOnViewData 
    { 
    [Required] 
    public string UserName { get; set; } 

    [Required] 
    public string Password { get; set; } 
    } 

    [HandleError] 
public class AccountController : Controller 
{ 
     [HttpPost] 
     public ActionResult LogOn(LogOnViewData lvd, string returnUrl) 
     { 

     if (ModelState.IsValid) 
     { 
     //do stuff - IsValid is always true 
     } 
     } 
    } 
} 

的ModelState中始终有效。但是,该模型正在正确填充。因此,如果我将用户名和密码留空,并且发布表单,模型状态仍然有效。哎呀!

额外信息:使用物联网的结构图。以前,升级到MVC 2之前使用MS数据注释库,所以这在我的global.asax.cs中: ModelBinders.Binders.DefaultBinder = new Microsoft.Web.Mvc.DataAnnotations.DataAnnotationsModelBinder();

现在已经删除了。

我确定我正在做一些非常基本和错误的事情。如果有人能指出这将是奇妙的。 干杯

回答

0

通过MVC2开发的一半,他们从输入验证转为模型验证,这应该在所有情况下都完全验证您的对象。确保你使用的是最新版本(RTM)。

但是,[Required]只是表示该属性不能是null。不幸的是,String.Empty(这是字符串的默认值)不是null,因此模型验证将传递给空字符串。

请参阅this post by Brad Wilson for important details

作为解决方案,您可以使用[RegularExpression("....")]对最小字符串长度和允许的字符施加限制。

+0

哦,我明白了 - 谢谢。这确实是非常有意义的:) 但是,我已经开始了一个全新的MVC项目,它对登录控制动作进行了验证,这与我的几乎完全一样。当然,它工作正常。我只是有点难以理解,不同之处在于! 再次感谢 – Louzzzzzz 2010-03-19 08:42:08

+0

修正了它!删除然后重新添加我的web项目中的所有引用,并按预期工作。 – Louzzzzzz 2010-03-19 09:10:27