代码之家  ›  专栏  ›  技术社区  ›  Gup3rSuR4c

是否可以使用数据注释进行“选择性”验证?

  •  1
  • Gup3rSuR4c  · 技术社区  · 14 年前

    我有一个表格,现在张贴13个对象。有些对象可以是可选的,比如推荐者,其他的则不能。问题是,如果我使用dav并用验证属性(如 [Required] 即使对象是可选的,整个post也会失败,因为 ModelState 将无效。

    我可以移除 [必需的] 所有物品的装饰,但那不合适。那么,有没有一种方法可以在仍然使用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>
    

    在这 简化得多 我的工作形式 Job Description ( 描述 真的是 Note 就数据库而言,输入)。 工作 必须填写信息,但说明是可选的。表格的问题是 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.Text 从未填写过。

    第二个问题是因为dav如果 说明.文本 如果未填充,则整个模型将无法验证,因为它是 注释 . 因此,我甚至没有机会做其他事情。

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

    我想的一个方法是不要传递对象 方法是将它们实例化 在里面 方法,然后执行 TryUpdateModel 依次检查每个模型的状态并基于条件继续。这可能需要大量的代码,所以我想在进入解决方案之前看看是否有更自动化的版本。

    非常感谢您的帮助!

    1 回复  |  直到 14 年前
        1
  •  0
  •   exploringintent    14 年前

    我的建议是为这种情况创建视图模型(用于视图数据/验证和模型绑定并稍后映射到数据库模型的简单模型)。尝试使用所有验证来推送业务/db模型并不总是可能的。如果一个模型在某些地方的验证与大多数地方不同,那么你可能只是因为它们都是绿色的,就把一个圆的钉子塞进一个正方形的洞里。如果由于某些限制而必须使用相同的对象,则可以选择忽略验证或从控制器上的modelstate字典中删除有问题的错误,但这不是一个好主意。