2011-12-28 5 views
1

У меня возникла проблема с проверкой в ​​моделях EF, которые я не могу понять. Ненавязная часть проверки Javascript работает так, как ожидалось.EF ComplexType и валидация

Рассмотрим следующие модели (атрибут 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);