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。

有什么建议吗?最整洁的方法是什么?

ASP.NET MVC在验证之前修改视图模型属性

如果将自动实现的属性更改为手动实现的属性,则可以在设置值时执行"清理"步骤,因此它只能以"清理"状态存储在模型中。类似这样的东西:

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(...)};
}

希望这能给你一些方向。