我有一个表格,现在可以发布13个对象。一些对象可以是可选的,比如推荐者,其他人不可以。问题是,如果我使用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
工作这个大大简化形式(Description
真是Note
型就DB而言)。必须填写信息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
所以条件检查,如果Description
为空,如果Description.Text
从来没有填充永远不会甚至称in。
第二个问题是因为DAV,如果Description.Text
没有填充,那么整个模型将无法通过验证,因为它是Note
的必填字段。因此,我甚至没有机会做其他事情。
所以,我想我的问题是,什么是适当的方式来实现验证(DAV?)的对象可以在UI形式是可选的,但由于数据库设计本身具有必需的字段?我在想
一种方式是不是传递对象的方法是实例化它们在的方法,然后才能在每一个执行TryUpdateModel
,检查模型状态,并继续在基于条件。这可能需要很多代码,所以我想在跳入该解决方案之前查看是否有更自动的版本。
帮助将不胜感激!
你能澄清一下你真正想在这里发生吗?我从你的文章中了解到,必须填写Job对象(如果您发布了Job类的代码,这将很有用),但Description.Text字段是可选的。如果Description.Text是可选的,那么为什么你用一个Required数据注解来装饰它? – 2011-04-05 09:17:35
一个'Description'是数据库中的'Note',与'Job'的关系为1:1。由于'Note'必须有文本才能成为音符,所以文本属性是必需的。最后,我问了这个MVC 3之前的版本,现在已经不存在了,我可以利用其中的新DAV来做我所需要的。 – Gup3rSuR4c 2011-04-05 21:47:03