【问题标题】:ASP.NET MVC Modify view model property before validationASP.NET MVC 在验证前修改视图模型属性
【发布时间】:2014-09-29 14:34:52
【问题描述】:

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

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

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。

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

【问题讨论】:

  • 那么你需要一个自定义的ModelBinder来做这个

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


【解决方案1】:

如果您将自动实现的属性更改为手动实现的属性,那么您可以在设置值时执行“清理”步骤,因此它只能以“清理”状态存储在模型中。像这样的:

public class PersonViewModel
{
    private string _socialSecurityNumber;

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

【讨论】:

  • 我在谷歌搜索时确实遇到了这种解决方案。忘了在问题中提到它。也许这是最干净的解决方案。至少比自定义模型绑定器更喜欢它。
  • 你有两种方法来处理这个问题。您可以使验证非常严格并且不接受空格,或者您可以在模型级别清理它并使验证松散。在模型级别这样做的好处是您不必担心客户端和服务器端,您只需要处理服务器端。
  • 我有一个静态方法可以清除 setter 中的 SSN。但是,我确实需要清理 ValdationAttribute 中的值以使其正常工作。不太理想的解决方案,但仍然比自定义模型绑定器更好。
【解决方案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(...)};
}

希望这能给你一些方向。

【讨论】:

    猜你喜欢
    • 2010-11-18
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多