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

时间:2014-09-29 14:34:53

标签: c# asp.net asp.net-mvc model-binding custom-attributes

我一直在疯狂搜索没有结果,也许我只是错过了正确的关键字。

我有一个在属性上有自定义验证属性的类。我想"清洁"验证前的值,删除我们接受但我们不想保存到数据库的空格和特殊字符。

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。

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

2 个答案:

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

希望这会给你一些指导。