我有一个表格,现在张贴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
依次检查每个模型的状态并基于条件继续。这可能需要大量的代码,所以我想在进入解决方案之前看看是否有更自动化的版本。
非常感谢您的帮助!