2012-05-06 3 views
3

Мой текущий веб-проект имеет интерфейс администрирования, в котором детали пользователя могут быть отредактированы (на самом деле не революционизирую, я признаю ...). Вид использует строго типизированных модель пользователя, с атрибутами проверки:Подтвердить только грязные входы

public class UserPrototype 
{ 
    [Required] 
    [StringLength(50, MinimumLength = 4)] 
    public string Username { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1] 
    public string LastName { get; set; } 

    [Required] 
    [StringLength(250, MinimumLength = 6] 
    public string Password { get; set; } 

    /* 
     And so on 
    */ 
} 

Когда пользователь обновляется, я хотел бы обновить только в базе данных тех полей, которые на самом деле изменились. Основной причиной является поле пароля - пароль, конечно, хранится как хэш, поэтому, когда пользователь возвращается для редактирования, в этом поле нет ничего значимого. Но для проверки правильности привязки модели требуется действующий пароль.

Итак, могу ли я использовать один и тот же класс, но как-то только проверять те поля, которые представлены как измененные (это я могу выполнить, хотя javascript)? Я бы хотел избежать дублирования класса UserPrototype, чтобы удалить атрибуты Required.

ответ

1

Используйте наследование, таким образом, вам не нужно дублировать.

public class BaseUserPrototype 
{ 
    [Required] 
    [StringLength(50, MinimumLength = 4)] 
    public string Username { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1)] 
    public string FirstName { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 1] 
    public string LastName { get; set; } 

    /* 
     And so on 
    */ 
} 

public class NewUserPrototype: BaseUserPrototype 
{ 
    [Required] 
    [StringLength(250, MinimumLength = 6] 
    public string Password { get; set; } 

    /* 
     And so on 
    */ 
} 
public class EditUserPrototype: BaseUserPrototype 
{ 
    [StringLength(250, MinimumLength = 6] 
    public string Password { get; set; } 
    /* 
     And so on 
    */ 
} 
+0

Ах, но я все еще хочу, чтобы это было возможно * изменить пароль. Но не нужно знать пароль и повторно вводить его, чтобы изменить какой-то другой параметр ... – carlpett

+0

Обновлен мой ответ. В сценарии редактирования удалите требуемый атрибут. –

0

Вы можете использовать интерфейс IDataErrorInfo; Реализуйте это на своей сущности таким образом:

public class Entity: IDataErrorInfo 
{ 
// this is the dictionary of errors 
    private readonly Dictionary<string, string> _errors = new Dictionary<string, string>(); 
    private string _password; 

    public string Password 
    { 
     get{return _password;} 
     set 
     { 
     // YOUR ACTUAL VALIDATION CODE HERE. IF THERE IS A VALIDATION ERROR - ADD IT TO THE DICTIONARY 
      if(string.IsNullOrEmpty(value)) 
      _errors["Password"] = "Error with password field"; 
     } 
    } 
} 
Смежные вопросы