2014-09-18 3 views
0

Я новичок в MVC, поэтому я пытаюсь выяснить некоторые лучшие практики.MVC обнаруживает, что модель пуста

Предположим, у меня есть контроллер HomeController метод Index(MyViewModel model):

public ActionResult Index(MyViewModel model) 
{ 
    //if loading the page for the first time, do nothing 
    //if the page has been posted data from somewhere, then I want to use 
    // some of the arguments in model to load other data, like say search results 
} 

Когда я перейти к /Index странице, I (я) ожидать, что model объект прийти через, как нуль, но это не так. MVC (как-то) создает для меня MyViewModel.

Мой вопрос: какой лучший способ или наиболее подходящий для определения того, был ли model создан автоматически или через сообщение?

Идеи:

  • Создать объект на MyViewModel, который получает значение, когда представление размещения назад
  • Проверить, если Request.HttpMethod == "GET" или "POST"
  • что-то еще?
+0

Автоматическое связывание может создать MyViewModel, но значения заполнены? Свойства модели, вероятно, равны нулю. – Jasen

+0

Если вы спрашиваете, была ли форма опубликована? приложите атрибут [HttpPost] к вашему методу, который ожидает модель. – Rab

ответ

4

Вы должны использовать различные действия для своих запросов GET и POST. Не пытайтесь сделать один метод слишком много.

[HttpGet] 
public ActionResult Index() 
{ 
    // handle the GET request 
} 

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     // it's a post and the data is valid 
    } 
} 

Правильный метод будет называться в зависимости от того, является ли это GET или POST

+0

Хорошо, я не понимал, что если бы у меня было два метода, я мог бы возвратить 'View()' на Post One и по-прежнему указывать на 'Index'. Благодаря! – DLeh

2

Создайте два действия, один из которых принимает экземпляр модели и тот, который не делает.

Даже если вы «идете на ту же страницу», вы на самом деле выполняете два совершенно разных действия. Первое действие загружает начальную страницу, второе действие - какое-то значение, на которое нужно воздействовать. Два действия означают два метода:

[HttpGet] 
public ActionResult Index() 
{ 
    // perform any logic, but you probably just want to return the view 
    return View(); 
} 

[HttpPost] 
public ActionResult Index(MyViewModel model) 
{ 
    // respond to the model in some way 
    return View(model); 
    // or return something else? a redirect? it's up to you 
} 

Обратите внимание, что этот вид прерывает ваши спокойные URL-адреса. Рассмотрим семантически, что вы делаете в этих действиях:

  • Просмотр такой индекс
  • Проводка к индексу

Первый имеет смысл, но второй один, вероятно, нет. Обычно, когда вы POST что-то у вас есть что-то связано с моделью или действием какого-то рода. «Индекс» на самом деле не описывает действие. Вы «Создаете» что-то? Вы «редактируете» что-то? Они звучат как более значимые имена действий для действия POST.