【问题标题】:MVC2: Validating User Input / Best PracticesMVC2:验证用户输入/最佳实践
【发布时间】:2010-03-09 22:30:18
【问题描述】:

我正在尝试验证用户输入,尤其是用户密码。我有一些 jQuery 验证,但当然我还需要在服务器端进行验证。现在我的请求进入控制器,控制器会将其交给UserService。一切都是松耦合的,所以控制器对内部的UserService真的不太了解。现在假设用户输入了一个弱密码,所以我需要告诉他“嘿,这还不够。”

问题是:最好的方法是什么?

不知何故,我需要能够打电话

ModelState.AddModelError(field, exception);

为了指出出错的地方、位置和原因——在这个简单的例子中,我已经知道它是密码,因为它确实是表单上唯一的字段,但总的来说这并不容易。现在我快要编写自己的 Exception 类型来做类似的事情了

ModelState.AddModelError(ex.Field, ex.Message);,我可能需要一些额外的映射 - 这是在 NerdDinner 中使用的路径,他们有 RuleViolations

但是,在 NerdDinner 中,业务对象是自我验证的。在这种情况下,这似乎不是最好的方法,因为这里的“业务对象”实际上只是实现IIdentity 的电子邮件和密码的存储。它不应该知道任何关于密码长度的信息,并且应该可以在不同的应用程序中重复使用。

此外,ArgumentExceptionValidationException 似乎也不适合,因为前者用于违反合同,而后者用于 DataAnnotations

所有这些当然只是冰山一角,因为潜伏着许多微妙之处。也许有人可以指出我正确的方向?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-2 validation


    【解决方案1】:

    您可以使用xVal

    【讨论】:

    • 谢谢,这看起来很有希望,我得更详细地研究一下。
    【解决方案2】:

    如果我理解正确,您想验证用户密码是否足够。如果您没有在对象本身上使用自我验证,那么我可以建议您在您的用户服务上放置一个验证方法。

    ...
    var result = userService.Validate(newUser);
    if (!result.IsValid) {    
        result.Errors.ForEach( m => ModelState.AddModelError(m.field, m.message));
    }
    ...
    

    怎么样?

    这种方法的唯一问题是,要访问围绕用户对象的任何验证,您必须将其传递给 userService,这可能是也可能不是您想要做的。

    回答下面的评论:

    你必须创建一个 ValidationResult,类似于。

    public class ValidationResult
    {
       public string Field {get;set;}
       public string Message {get;set;}
    }
    

    所以如果我没看错的话,你的控制器有一个用户服务,用户服务有一个验证器,验证器验证用户。

    当您将此验证从您的 Validator 传递到 UserService 到 Controller 时,只需拦截并使用它,然后传递它。

    如果您不想扮演自己的验证库的角色(而且您不应该),可以使用一些很棒的工具,例如 Enterprise Library 和 FluentValidation。如果这是您所关心的,他们可以在您的对象外部单独定义您的验证逻辑。

    【讨论】:

    • 感谢您的回答。恐怕我的问题有点不准确:UserService 将进一步委派部分工作,因此同样的问题将出现在UserService 与实际验证者的通信中。更重要的是:userService.Validate(); 在您的代码中返回什么类型的对象?这意味着我必须自己烤这个,对吧?
    猜你喜欢
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多