【发布时间】: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>
在这个非常简化的表单中,我正在使用Job 和Description(就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