【问题标题】:ASP.NET validation of model's nested propertiesASP.NET 验证模型的嵌套属性
【发布时间】:2011-09-01 13:44:11
【问题描述】:

我正在尝试使用 TryUpdateModel 验证包含具有验证规则的其他对象的模型:

public class Post
{
    public User User;
}

public class User : IValidatableObject
{
    public string Captcha;

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {            
        if (/* check if captcha valid */)
        {
            yield return new
                ValidationResult("Captcha invalid.",
                    new[] { "Captcha" });
        }
}

public ActionResult Edit(int postId, string title)
{
    var post = postsRepository.Get(postId);
    if (TryUpdateModel(post))
    {
        /* save */
    }
}

问题是嵌套用户也经过验证,但这是更新帖子并且表单中没有验证码字段,因此模型状态始终无效。如何仅验证帖子的值类型属性?

【问题讨论】:

    标签: asp.net-mvc model-binding model-validation nested-properties


    【解决方案1】:

    我不特别同意对用户模型进行 CAPTCHA 检查,除非您需要 CAPTCHA 在任何地方使用User 模型。

    话虽如此,你可以...

    • 创建一个必须设置的标志才能实际检查 CAPTCHA,否则返回有效。
    • 创建另一个与当前表单完全匹配的模型
    • 从模型中删除 CAPTCHA,并将其作为参数引入需要它的操作
    • 将 CAPTCHA 的标记值设置为默认值,该值始终返回有效
    • 大量其他想法...

    【讨论】:

    • 我知道我可以删除验证码并在模型验证后对其进行检查,但我想知道为什么即使我指向 TryUpdateModel 的 includeProperties 也会验证未进入 Request 的字段。
    • @donRumatta:因为您正在验证模型,而不是生成它们的请求参数。该过程首先填充模型,然后对整个模型运行验证。
    • 我只是在检查 model.isvalid 之前删除了 modelstate 的“验证码”条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多