2016-02-02 4 views
-1

Я работаю над веб-проектом, где я сначала получаю данные из базы данных и привязываюсь к элементу управления Html. Если есть ошибка проверки, я отправлю тот же вид назад для рендеринга с отображаемыми ошибками проверки. Когда страница появляется, появляется исключение. Я прошел через код и обнаружил, что модель передана, будет нулевой сбор. В основном любое свойство, не привязанное к текстовому полю, было изменено на null. Мне сказали не использовать сеанс или viewdata для хранения временного хранилища. Так я называю метод SaveViewState где сохранить все значение свойства свойства ViewModel к статической переменной, как такasp.net mvc Реализация ViewState

private static MyViewModel _viewModel; 

private MyViewModel SaveViewModel(MyViewModel viewModel) 
     { 
      if (_viewModel == null) 
      { 
       _viewModel = new MyViewModel(); 
      } 

      if (!string.IsNullOrEmpty(viewModel.MyName)) 
       _viewModel.MyName= viewModel.MyName; 
      if (!string.IsNullOrEmpty(viewModel.Number)) 
       _viewModel.Number= viewModel.Number; 
      if (!string.IsNullOrEmpty(viewModel.Address)) 
       _viewModel.Address= viewModel.Address; 
      if (!string.IsNullOrEmpty(viewModel.State)) 
       _viewModel.State= viewModel.State; 
      } 

Это работает, но я думаю, что это очень неэффективно и должно быть лучше реализовать ViewState в MVC с Session или ViewData или HiddenFields? Кстати, мне сказали не использовать этих троих.

Любая помощь приветствуется. Благодарю.

+0

Покажите, как вы используете коллекцию. Если вы публикуете действие, которое имеет модель в качестве параметра, оно должно быть заполнено. –

+0

Одна из многих причин, по которым была разработана MVC, заключалась в том, чтобы избавиться от 'ViewState'. Ваша реализация не будет работать, потому что она не является потокобезопасной (и все это не удастся, если более 1 пользователь редактирует экземпляр «MyViewModel»). Если вы не создаете элементы управления для отправки всех данных и должны вернуть представление, затем снова вызовите репозиторий, чтобы получить исходный объект и снова заполнить модель представления отсутствующими значениями. –

ответ

1

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

public ActionResult SomePost(SomeModel model) 
{ 
    if (!ModelState.IsValid()) 
    { 
     //error in validation 
     return View(model); 
    } 

    //post save redirect and stuff 
    return ... redirect? 
} 

ModelState.IsValid() испытает по DataAnnotations. Доступны стандартные атрибуты, такие как [Required], [MaxLength] и т. Д.

В этой конфигурации использование функции SaveViewModel не требуется. Если ваша коллекция null после публикации: повторите запрос, отправьте ее или выберите из объекта ViewData.

Есть веские причины, чтобы не использовать эти три вы упомянули, но если вы знаете, что причина вы могли бы хотеть рассмотреть это:

1) Использование сессии: сделает масштабируемость трудно, потому что каждый запрос на сессии должен ударил этот конкретный сервер.

2) Скрытые поля: Не проблема IFF, вы понимаете, что скрытое поле можно манипулировать в браузере. Так что не храните ID там

3) ViewData: в основном разбивает шаблон MVC; вы можете использовать его для хранения данных, но для этого и предназначена модель. Полностью законно использовать ViewData из фильтра. Например, для обеспечения некоторых общих функций.