我一直在疯狂搜索没有结果,也许我只是错过了正确的关键字。
我有一个在属性上有自定义验证属性的类。我想"清洁"验证前的值,删除我们接受但我们不想保存到数据库的空格和特殊字符。
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 :(得分:2)
如果您将自动实现的属性更改为手动实现的属性,那么您可以执行"清理"设置值时的步骤,因此它只能存储在模型中的" clean"州。像这样:
public class PersonViewModel
{
private string _socialSecurityNumber;
[SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")]
public string SocialSecurityNumber
{
get { return _socialSecurityNumber; }
set
{
_socialSecurityNumber = CleanSocialSecurityNumber(value);
}
}
}
答案 1 :(得分: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(...)};
}
希望这会给你一些指导。