我知道在MVC3可以创建一个model,为属性添加象[required]之类的特性,在render时,会自动设置验证。
在服务端也可以调用modelstate审查表单核验结果。可是,通常运用是比较自定义的,举个例子:
一个登录入口,有:
用户名,密码
两个文本输入,那这时,他不是一完整的model输入,我该如何做验证呢。
在web form架构下,我为这两个文本输入框分别设置require控件,然后在服务端调用page.isvalidate属性,即可知道表单是否验证通过。可是,在MVC怎么实现呢,不可能为了这个还有去创建一个只有用户名,密码的model吧?请教指导,谢谢!

解决方案 »

  1.   

    你这个问题我也遇到过
    包括使用在调用时使用[Bind(Exclude = "Id")]之流试图不去绑定这个参数,也不好使你的方法,建议直接遍历ModelState的键值,只查你需要验证的属性是true还是false
    大致的代码如下
    internal bool IsModelError(ModelStateDictionary ModelState,IEnumerable<string> Fields)
     {
                foreach (var field in Fields)
                {
                    if (ModelState[field].Errors.Count > 0) return false;
                }
                return true;
    }
      

  2.   

    扩展一下也挺好用。完整代码如下
    public static bool ValidateFields(this ModelStateDictionary msd, IEnumerable<string> needValidateFields)
        {
            foreach (var field in needValidateFields) 
            {
                if (msd.Keys.Contains(field))
                {
                    if (msd[field].Errors.Count > 0) return false;
                }
            } 
            return true;
        }
    调用示例 if (ModelState.ValidateFields(new string[]{"Name","Password"}))
                {
                    db.User.AddObject(user);
                    db.SaveChanges();
                    Message("已成功提交。");
                }
      

  3.   

    哎,你太依赖asp.net组件了。之前没写过asp、php的直接上手就是。net的一般都会这样。一个合法性验证,还需要什么require控件、page.isvalidate属性……js直接写嘛~什么长度、不可空、数字字母组合什么的,js判断一下嘛。随带说下js判断完了c#也得判断下,不合法就返回嘛。c#不仅判断合法性,再跟数据库做对比,是否存在该用户,是否密码正确之类的。
      

  4.   


    感谢关注,可能我还停留在WEB FORM阶段那种便捷开发观念。
    从这个常见的问题,本来在WEB FORM是很简单的事情,现在要改变了,貌似变得有点小复杂,一时有点接受不了,哈哈。
      

  5.   

    我自己知道两个解决方法,第一个办法是在服务端使用modelstate.remove 移除isvalid=false的属性。
    第二个就是在Model里设定属性的默认值供参考