2014-09-29 129 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 2014-09-29 14:45:51

回答

2

如果将自动实现的属性更改为手动实现的属性,则可以在设置该值时执行“清洗”步骤,因此只能以“干净”状态将其存储在模型中。类似这样的:

public class PersonViewModel 
{ 
    private string _socialSecurityNumber; 

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

当我使用Google时,我确实来过这种解决方案。忘了在问题中提到它。也许这是最干净的解决方案。至少比自定义模型绑定器更好。 – Tiax 2014-09-29 14:50:06

+1

你有两种方法来处理这个问题。要么你可以使验证非常严格,不接受空白,或者你可以在模型级别清理它,并使验证松动。在模型层面做这件事的好处是你不必担心客户端和服务器端,你只需要处理服务器端。 – 2014-09-29 15:34:41

+0

我有一个静态方法,清理setter中的SSN。但是,我需要清除ValdationAttribute中的值以及它的工作。较不理想的解决方案,但仍比自定义模型绑定器更好。 – Tiax 2014-09-30 06:41:49

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

希望这给你一些方向。