MVC 2 Validation и Entity Framework - PullRequest
1 голос
/ 05 мая 2010

Я искал как дурак, но не стал намного умнее для этого ..

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

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 Ответ

1 голос
/ 06 мая 2010

Если проверка работает, то 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
Charles

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

...