ASP.NET MVC在验证之前修改视图模型属性
本文关键字:修改 视图 模型 属性 NET MVC 验证 ASP | 更新日期: 2023-09-27 18:25:01
我一直在疯狂地搜索,但没有结果,也许我只是错过了正确的关键词。
我有一个在属性上具有自定义验证属性的类。我想在验证之前"清除"该值,删除我们接受但不想保存到数据库中的空白和特殊字符。
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。
有什么建议吗?最整洁的方法是什么?
如果将自动实现的属性更改为手动实现的属性,则可以在设置值时执行"清理"步骤,因此它只能以"清理"状态存储在模型中。类似这样的东西:
public class PersonViewModel
{
private string _socialSecurityNumber;
[SocialSecurityNumberLuhn(ErrorMessage = "Incorrect social security number")]
public string SocialSecurityNumber
{
get { return _socialSecurityNumber; }
set
{
_socialSecurityNumber = CleanSocialSecurityNumber(value);
}
}
}
这里推荐的方法是使用服务层。视图模型不应包含任何逻辑。对于服务层,您的控制器将在其关联的服务上调用一个方法,该方法将返回带有干净SSN的视图模型。
在本教程中,您将了解如何构建服务层,以及如何调整模式以在验证之前清理数据。
http://www.asp.net/mvc/tutorials/older-versions/models-(数据)/使用服务层进行验证
在您的示例中使用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(...)};
}
希望这能给你一些方向。