2010-11-04 41 views
1

我有一个表格,现在可以发布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> 

在我与JobDescription工作这个大大简化形式(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,检查模型状态,并继续在基于条件。这可能需要很多代码,所以我想在跳入该解决方案之前查看是否有更自动的版本。

帮助将不胜感激!

+0

你能澄清一下你真正想在这里发生吗?我从你的文章中了解到,必须填写Job对象(如果您发布了Job类的代码,这将很有用),但Description.Text字段是可选的。如果Description.Text是可选的,那么为什么你用一个Required数据注解来装饰它? – 2011-04-05 09:17:35

+0

一个'Description'是数据库中的'Note',与'Job'的关系为1:1。由于'Note'必须有文本才能成为音符,所以文本属性是必需的。最后,我问了这个MVC 3之前的版本,现在已经不存在了,我可以利用其中的新DAV来做我所需要的。 – Gup3rSuR4c 2011-04-05 21:47:03

回答

0

我的建议是创建视图模型(用于视图数据/验证和模型绑定的简单模型,稍后将映射到db模型)。试图用所有验证推动你的business/db模型并不总是可能的。如果某个模型在某些地方的验证方式不同,那么很可能是因为它们都是绿色的,因此您会在方形洞中强制使用圆钉。如果由于某些限制必须使用相同的对象,则可以选择忽略验证或从控制器上的ModelState字典中删除有问题的错误,但这不是一个好主意。

相关问题