2011-12-28 15 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);