2014-09-29 3 views
2

Я искал как безумный без искажений, может быть, я просто потерял правильные ключевые слова.ASP.NET MVC Изменить свойство модели представления до проверки

У меня есть класс с пользовательским атрибутом проверки свойства. Я хочу «очистить» значение до проверки, удалив белые пробелы и специальные символы, которые мы принимаем, но которые мы не хотим сохранять в базе данных.

public class PersonViewModel 
{ 
    [SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")] 
    public string SocialSecurityNumber { get; set; } 
} 

Я хотел бы сделать что-то вроде этого:

public class PersonViewModel 
{ 
    [CleanWhiteSpace] 
    [SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")] 
    public string SocialSecurityNumber { get; set; } 
} 

Например 1985-03-15-1234 должен быть сохранен и утвержден в качестве 19850315-1234.

Любые предложения? Какой самый опрятный подход?

+0

Тогда вам понадобится пользовательский ModelBinder для этого – Fals

ответ

2

Если вы изменили свойство автоматически реализованное в свойство, реализованное вручную, вы можете выполнить «очистку» при установке значения, поэтому его можно сохранить только в модели в «чистом» состоянии. Что-то вроде этого:

public class PersonViewModel 
{ 
    private string _socialSecurityNumber; 

    [SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")] 
    public string SocialSecurityNumber 
    { 
     get { return _socialSecurityNumber; } 
     set 
     { 
      _socialSecurityNumber = CleanSocialSecurityNumber(value); 
     } 
    } 
} 
+1

Я пришел к такому решению, когда искал googled. Забыл упомянуть об этом в вопросе. Может быть, это самое чистое решение. Как будто это лучше, чем нестандартное связующее устройство. – Tiax

+1

У вас есть два способа справиться с этим. Либо вы можете сделать валидацию очень строгой и не принимать пробелы, либо вы можете очистить ее на уровне модели и сделать проверку правильной. Преимущество этого на уровне модели состоит в том, что вам не нужно беспокоиться о клиентах и ​​серверах, вам нужно иметь дело только с серверной стороной. –

+0

У меня есть статический метод, который очищает SSN в сеттере. Однако мне нужно очистить значение в ValdationAttribute, чтобы он работал. Менее идеальное решение, но все же лучше, чем обычное связующее устройство. – Tiax

2

Рекомендуемый подход здесь - использовать сервисный уровень. Модели просмотра не должны содержать никакой логики. С сервисным уровнем Контроллер будет вызывать метод в связанной службе, и этот метод вернет вашу модель представления с чистым SSN.

В этом уроке вы увидите, как можно структурировать сервисный уровень, и вы можете адаптировать шаблон для очистки своих данных до проверки.

http://www.asp.net/mvc/tutorials/older-versions/models-(data)/validating-with-a-service-layer-cs

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

контроллер, где вы инъекционные/экземпляр класса обслуживания

public ActionResult GetPerson(int PersonId){ 
    return _personService.GetPerson(personId); 
} 

Метод обслуживания

public PersonViewModel GetPerson(int Id){ 
    // get the data (maybe from DAL) and clean returning view model 
    return new PersonViewModel(){SocialSecurityNumber = Clean(...)}; 
} 

Надежда это дает вам некоторое направление.

Смежные вопросы