ASP.NET MVC 3 POST ModelState и ViewModel - PullRequest
1 голос
/ 27 мая 2011

В моем приложении ASP.NET MVC 3 у меня есть страница, где после отправки формы мне нужно изменить значение из формы. Если я делаю это в ViewModel, это не имеет никакого эффекта, я должен сделать это, используя ModelState["Field"].Value.

Дело в том, что на самом деле у меня много работы, которую я должен выполнить в ViewModel, когда страницы загружаются И после POST. Итак, у меня есть метод, который получает ViewModel и выполняет всю эту работу. Но, как я уже сказал, после POST изменение объекта ViewModel бесполезно. Это почему? Метод на контроллере возвращает View(viewModel);. Разве представление не должно использовать значения ViewModel?

Я хотел бы понять, почему бесполезно изменять ViewModel, а также знать, есть ли какой-либо метод в ModelState, который «обновляет» значения полей, выбрасывает объект ViewModel.

Вот мой код контроллера:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(MyViewModel viewModel)
{
    try
    {
        if (ModelState.IsValid)
            //Do stuff and redirect
    }
    catch(Exception ex)
    {
        //Log and add error to the ModelState
    }

    someMethodWhichDoesALotOfThingsInTheViewModel(viewModel);
    return View(viewModel);
}

Я думаю, что остальная часть кода не нужна, если кто-то думает, что это поможет, дайте мне знать!

Обновление

Я не хочу терять какие-либо ошибки, даже те, которые были изменены в ViewModel. Хорошим примером может быть капча, если пользователь делает какую-либо ошибку в форме (только с полем капчи или только с любыми другими полями, а не с капчей). Я хочу показать ему все его ошибки, а также обновить капчу. Нет смысла визуализировать форму со вставленным старым значением капчи, поэтому я хочу очистить это поле.

Обновление 2

Я решил добавить @Value = Model.PropertyInViewModel в атрибуты HTML каждого Html.TextBoxFor. Но я бы предпочел избегать этой неприятной работы, поэтому, если кто-то найдет какое-нибудь лучшее решение, пожалуйста, дайте мне знать.

Ответы [ 3 ]

4 голосов
/ 28 мая 2011

Будет работать следующее:

ModelState.Remove("MyProperty");
viewModel.MyProperty = "new value";

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

0 голосов
/ 23 декабря 2012

Если вы решите удалить значения состояния модели для предотвращения циклического отключения, взгляните на этот RemoveFor() метод расширения, который я сделал для удаления ошибок ModelState без магических строк.

0 голосов
/ 30 мая 2011

Все, что я мог предложить, это добавить @Value = Model.PropertyInViewModel к каждому Html.TextBoxFor, который будет изменен во ViewModel.

Другой способ, как сказал @Darin Dimitrov, состоит в том, чтобы сделать мойсобственные помощники.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...