2010-05-05 5 views
1

Я искал, как дурак, но не становится намного умнее за это ..MVC 2 валидация и Entity Framework

В моем проекте я использую Entity Framework 4 и собственные классы POCO и я хочу использовать DataAnnotations для проверки. Там нет проблем, сколько времени в Интернете о том, как я это делаю. Тем не менее, я считаю, что лучше всего использовать мою проверку в ViewModels и не позволять моим представлениям использовать мои классы POCO для отображения данных. Как я должен делать это плавно? Поскольку мои репозитории возвращают obejekt из моих классов POCO, я пытался использовать AutoMapper, чтобы все работало, но когда я пытаюсь обновить или изменить что-либо в ModelState.IsValid, все время ложно.

Мой английский действительно плохой, попробуйте показать, как я делаю сегодня, вместо этого: Мой ПОКО

public partial User { 
    public int Id { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
} 

И мой ViewModel

public class UserViewModel { 
    public int Id { get; set; } 

    [Required(ErrorMessage = "Required")] 
    public string UserName { get; set; } 

    [Required(ErrorMessage = "Required")] 
    public string Password { get; set; } 
} 

контроллер:

public ActionResult Edit(int id) { 
    User user = _userRepository.GetUser(id); 
    UserViewModel mappedUser = Mapper.Map<User, UserViewModel>(user); 

    AstronomiGuidenModelItem<UserViewModel> result = new AstronomiGuidenModelItem<UserViewModel> { 
     Item = mappedUser 
    }; 

    return View(result); 
} 

[HttpPost] 
public ActionResult Edit(UserViewModel viewModel) { 
    User user = _userRepository.GetUser(viewModel.Id); 
    Mapper.Map<UserViewModel, User>(viewModel, user);  

    if (ModelState.IsValid) { 
     _userRepository.EditUser(user); 

     return Redirect("/"); 
    } 

    AstronomiGuidenModelItem<UserViewModel> result = new AstronomiGuidenModelItem<UserViewModel> { 
     Item = viewModel 
    }; 

    return View(result); 
} 

Я заметил, что моя проверка работает нормально, но мои значения равны нулю, когда я пытаюсь отправить и обновить базу данных. Я один главный ViewModel, который выглядит следующим образом:

public class AstronomiGuidenModelItem<T> : AstronomiGuidenModel { 
    public T Item { get; set; } 
} 

Почему г мой «UserViewModel ViewModel» нулевым, тогда я пытаюсь изменить?

ответ

1

Если валидация работает, то UserViewModel viewModel не должно быть пустым ... или это значит, что проверка на стороне клиента работает, а на стороне сервера нет?

Если это так, то это может быть из-за сгенерированного HTML.

Например, если по вашему мнению, у вас есть:

<%: Html.TextBoxFor(x => x.Item.UserName) %> 

HTML, который визуализируется могло быть:

<input name="Item.UserName" id="Item_UserName" /> 

Когда это становится связыванием на сервере, то нужно ваш параметр действия будет называться так же, как префикс ввода (Item). Например.

public ActionResult Edit(UserViewModel item) { 

Чтобы обойти эту проблему, сделать как указано выше, и измените параметр действия на item ИЛИ вы можете инкапсулировать форму в отдельный PartialView который принимает UserViewModel как ее модель - этак Html.TextBoxFor не будет оказана с префикс.

HTHS,
Чарльз

Ps. Если я полностью не в курсе, не могли бы вы разместить какой-то код для представления.

+0

Я нашел глупую проблему, 'UserViewModel' может быть' AstronomiGuidenModelItem '. –

Смежные вопросы