【问题标题】:Update only part of a Model, validation problem?仅更新模型的一部分,验证问题?
【发布时间】:2011-04-03 05:54:56
【问题描述】:

我有一个注册页面,用户可以在其中输入他的名字、姓氏、电子邮件和密码,以及其他字段。

我已将验证属性绑定到此模型(称为“用户”并通过 LINQtoSQL 创建)并且一切正常。

型号代码:

[MetadataType(typeof(UserValidation))]
public partial class User { }

[Bind(Exclude = "UserID")]
[PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The password and confirm password don't match.")]
public class UserValidation 
{
    [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")]
    public string FirstName { get; set; }

    [Required(ErrorMessage = "Last name required"), StringLength(20, MinimumLength = 3, ErrorMessage = "Must be between 3 and 20 characters")]
    public string LastName { get; set; }

    [Required(ErrorMessage = "Email address required"), RegularExpression("^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*\\.([a-z]{2,4})$", ErrorMessage = "Must be a valid email address")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Password required"), StringLength(20, MinimumLength = 6, ErrorMessage = "Password must be between 6 and 20 characters")]
    public string Password { get; set; }

    [Required(ErrorMessage = "Confirm password required"), StringLength(20, MinimumLength = 6, ErrorMessage = "Password must be between 6 and 20 characters")]
    public string ConfirmPassword { get; set; }

}

注册和登录后,我希望用户能够在一个视图中编辑他们的名字、姓氏和电子邮件(我们称之为“帐户”字段),并在另一个视图中编辑“密码”。这就是我的问题所在。

当我通过注册中使用的同一模型(“用户”)提交更新帐户字段数据的表单时,IsValid 方法会针对缺少的“密码”字段显示 ModelState 错误。

控制器代码:

    //
    // GET /Talent/Account
    public ActionResult Account()
    {
        string cookieUser = User.Identity.Name;
        User user = userRepository.GetUserByEmail(cookieUser);
        return View(user);
    }

    // POST /Talent/Account
    [HttpPost]
    public ActionResult Account(User model)
    {

        if (ModelState.IsValid)
        {
    // do something
            ModelState.AddModelError("", "All good.. "+ model.FirstName + " - " + model.LastName);
        }

        return View(model);
    }

我怎样才能解决这个问题?最佳实践等...

【问题讨论】:

    标签: c# asp.net-mvc linq-to-sql model


    【解决方案1】:

    在 Model-View-ViewModel (MVVM) 方式中,您应该创建两个 ViewModel:一个用于创建新帐户,另一个用于编辑名称字段而无需密码。

    将验证属性应用于您的 ViewModel,而不是直接应用于您的模型。

    一些示例包装 ViewModel 类:

            [Bind(Exclude = "UserID")]    
            public class UserForAccountEdit
            {
                public User UserAccount { get; set; }
    
                [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")]  
                public string FirstName  
                {  
                  get 
                       { return UserAccount.FirstName };  
                  set
                       { UserAccount.FirstName = value; }
                }  
    
                ...
            }    
    
    
    
            [Bind(Exclude = "UserID")]
            [PropertiesMustMatch("Password", "ConfirmPassword", ErrorMessage = "The password and confirm password don't match.")]
            public class UserForAccountCreation
            {
                public User UserAccount { get; set; }
    
                [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")]  
                public string FirstName  
                {  
                  get 
                       { return UserAccount.FirstName };  
                  set
                       { UserAccount.FirstName = value; }
                }  
    
                ...
            }
    

    【讨论】:

    • 感谢您的建议。关于如何实现它的任何基本代码示例?
    • 为您的 User L2SQL 类创建两个“包装”类。一种用于创建帐户,另一种用于无需密码的编辑。将验证属性应用于这些包装类,而不是使用 Metadata 属性将它们直接应用于 L2SQL 生成的类。
    • 更有意义,需要在实际中看到它。请问有代码示例吗?
    • @shahid81 - 查找有关面向对象的 C# 子类化的任何教程。
    • @jfar:实际上 LINQ to SQL 不支持子类化,除非在鉴别器列的情况下,这可能会污染他的模型。更新一个例子。
    猜你喜欢
    • 2019-09-06
    • 2011-09-06
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2011-01-02
    相关资源
    最近更新 更多