2011-12-28 84 views
1

我在EF模型中验证问题,我似乎无法弄清楚。不显眼的Javascript验证部分按预期工作。EF复杂类型和验证

考虑以下车型(该RequiredIf属性为this library):

public class Conversation 
{ 
    public int Id { get; set; } 
    public User User { get; set; } 
    public String Handler { get; set; } 
} 

[ComplexType] 
public class User 
{ 
    public bool Anonymous { get; set; } 
    [RequiredIf("Anonymous", false)] 
    [Display(Name = "Full name")] 
    public String Name { get; set; } 
} 

我的编辑视图仅显示字段User,这是我的控制器。

[HttpPost()] 
    public ActionResult Create(Conversation conversation) 
    { 
     if (ModelState.IsValid) 
     { 
      _db.Conversations.Add(conversation); 
      _db.SaveChanges(); // fails on this line 
     } 
     return RedirectToAction("Index"); 
    } 

这将导致以下错误:

DbUnexpectedValidationException: An unexpected exception was thrown during validation of 'Full name' when invoking Mvc.ValidationToolkit.RequiredIfAttribute.IsValid. See the inner exception for details. 

而且内部异常:

Member 'Conversation.Anonymous' not found. 

为什么突然验证寻找Conversation.Anonymous,而不是Conversations.Client.Anonymous

回答

2

你不应该直接在你的视图中使用你的实体。创建特定于视图的视图模型,然后使用类似AutoMapper的东西将域对象映射到视图模型。将所有必需的,长度等验证放在您的视图模型上。

var model = Mapper.Map<Conversation, ConversationViewModel>(conversation); 

return View(model);