【问题标题】:Is it possible to have "selective" validation with Data Annotations?是否可以使用数据注释进行“选择性”验证?
【发布时间】:2010-11-04 02:12:35
【问题描述】:

我现在有一个发布 13 个对象的表单。有些对象可以是可选的,例如Referrer,有些则不能。问题是,如果我使用 DAV 并使用 [Required] 等验证属性装饰对象,即使该对象是可选的,整个帖子也会失败,因为 ModelState 将无效。

我可以从所有对象中删除[Required] 装饰,但这不合适。那么,有没有办法在仍然使用 DAV 的同时选择性地验证单个对象?

考虑一下:

<form>
    <input type="hidden" name="Description.AuthorId" value="{?}" />
    <p>
        <label>Office</label>
        <select name="Job.OfficeId">{?}</select>
    </p>
    <p>
        <label>Description</label>
        <textarea name="Description.Text"></textarea>
    </p>
</form>

在这个非常简化的表单中,我正在使用JobDescription(就DB 而言,Description 实际上是Note 类型)。 Job信息必须填写,但描述是可选的。表单的问题是 Description.AuthorId 总是填充当前授权用户的 Id。

public class Note {
    [Required]
    public short AuthorId { get; set; }

    [Required, StringLength(XXX)]
    public string Text { get; set; }
}

public RedirectToRouteResult Jobs(
    [Bind(Prefix = "Job", Include = "OfficeId")] Job Job,
    [Bind(Prefix = "Description", Include = "AuthorId,Text")] Note Description) {
    if (ModelState.IsValid) {
        if (Description != null) {
            Description.Job = Job;
        };

        DataContext.Jobs.InsertOnSubmit(Job);
        DataContext.SubmitChanges();
    };
}

该方法的第一个问题是,由于表单总是会生成Description,因为表单总是会传递Description.AuthorId,因此即使@987654335 也不会调用Description 是否为空的条件检查@ 从未填写。

第二个问题是因为 DAV,如果没有填充 Description.Text,那么整个模型将无法验证,因为它是 Note 的必填字段。因此,我什至没有机会做任何其他事情。

所以,我想我的问题是,在 UI 表单中可能是可选的对象上实现验证 (DAV?) 的正确方法是什么,但由于数据库设计,它本身具有必填字段?

我正在考虑的一种方法是将对象传递给方法而不是将对象实例化方法中,然后对每个对象执行TryUpdateModel按顺序检查模型状态并根据条件继续。这可能需要大量代码,所以我想看看是否有更自动的版本,然后再进入该解决方案。

非常感谢您的帮助!

【问题讨论】:

  • 你能澄清一下你真正想要在这里发生的事情吗?我从您的帖子中的理解是必须填写 Job 对象(如果您发布 Job 类的代码会很有用),但 Description.Text 字段是可选的。如果 Description.Text 是可选的,那你为什么要用必需的数据注解来修饰它呢?
  • A Description 是数据库中的 Note,与 Job 具有 1:1 的关系。由于 Note 必须有文本才能作为注释,因此 text 属性是必需的。最后我问了这个 pre-MVC 3,现在它已经发布了,我可以利用它中的新 DAV 来做我需要的事情。

标签: asp.net-mvc validation data-annotations


【解决方案1】:

我的建议是为这种情况创建视图模型(用于视图数据/验证和模型绑定并稍后映射到数据库模型的简单模型)。尝试通过所有验证来推动您的业务/数据库模型并不总是可能的。如果某个模型在某些地方的验证方式与大多数情况下不同,那么您很可能只是因为它们都是绿色的而在方孔中强制使用圆钉。如果由于某些限制您绝对必须使用相同的对象,您可以选择忽略验证或从控制器上的 ModelState 字典中删除违规错误,但这不是一个好主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    相关资源
    最近更新 更多