@Html.DropDownListFor вызывает проблемы в [HttpPost] ActionResult. Исключение Null Reference Exception не было обработано ошибкой пользователя.

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

Вот ViewModel:

 public class New_Product_View_Model
  {
    public int SelectedManufacturerID { get; set; }
    public SelectList Manufacturers { get; set; }
    public int SelectedCategoryID { get; set; }
    public SelectList Categories { get; set; }
  }

Вот действие [HttpGet] Controller:

public ActionResult Insert_New_Product()
   {
        var dbcontext = new LNQ2SQLDataContext();
        var CatQ = from P in dbcontext.Categories
                where P.SUB_CAT == null
                select P;

        var ManQ = from P in dbcontext.Manufacturers
                   select P;

        var VM = new New_Product_View_Model();
        VM.Categories = new SelectList(CatQ, "CAT_ID", "CAT_Name");
        VM.Manufacturers = new SelectList(ManQ, "MAN_ID", "MAN_Name");

      //Passes the 'VM' to the view
        return View(VM);
   }

И представление, которое у меня есть, выглядит так:

@model MyAppName.ViewModels.New_Product_View_Model
@using (Html.BeginForm(FormMethod.Post))
    {
        @Html.DropDownListFor(m => m.SelectedCategoryID, Model.Categories, "-- Select a category --")
        <br />
        @Html.DropDownListFor(m => m.SelectedManufacturerID, Model.Manufacturers, "-- Select a manufacturer --")

    <input type="submit" value="Add New Product" />

    }

Пока все работает отлично

Теперь вот [HttpPost] ActionResult :

[HttpPost]
public ActionResult Insert_New_Product(New_Product_View_Model NPVM)
    {
      //A few things here
      //then
        return View();
    }

Когда я нажимаю кнопку отправки на странице, я получаю эту ошибку:

Посмотрите здесь

И, насколько я знаю, это потому, что Model в представлении равно null, когда запускается метод HttpPost. Поскольку return в действии HttpPost не имеет экземпляра New_Product_View_Model. Это глупо, потому что я не хочу передавать какие-либо модели в представление СНОВА! Я просто хочу, чтобы та же страница была доступна на случай, если мне нужно будет добавить больше продуктов.

Я попытался обменять return на этот:

return View(new New_Product_View_Model());

Но я получаю эту ошибку: см. изображение здесь

Я также пробовал это:

NPVM = new New_Product_View_Model();
return View(NPVM);

Но только что получил ту же ошибку.

У кого-нибудь есть решение? Я был бы очень признателен за любую помощь.


person Ali    schedule 01.08.2012    source источник


Ответы (2)


HTTP не имеет состояния, а MVC — прекрасный пример среды веб-разработки без сохранения состояния. каждый запрос как новый. Таким образом, вы должны повторно заполнить свойства коллекции, когда вы отправляете модель обратно в представление.

Рассмотрите возможность использования PRG (Post-Redirect-GET). Это означает, что если ваша транзакция (сохранение в БД) прошла успешно, вы должны выполнить Перенаправить на действие Get для показа нового продукта

[HttpPost]
public ActionResult Insert_New_Product(New_Product_View_Model model)
{
  if(ModelState.IsValid)
  {     

    //Save & If everything is fine, Do A Redirect (PRG pattern) to Get action
    return RedirectToAction("ShowProduct",new { id=model.ID});
  }

   //Model validation failed. Reload the stuff and send back to view     

    model.Categories = GetCategories();
    model.Manufacturers = GetManufacturers ();

    return View(model);
}

public ActionResult ShowProduct(int id)
{
  var item=repo.GetItemFRomId(id);
  return View(item);
}

Предполагая, что методы GetCategories() и GetManufacturers возвращают SelectList ваших категорий и производителей, который вы можете использовать для привязки раскрывающихся списков в своем представлении.

person Shyju    schedule 01.08.2012
comment
Потрясающе, Шиджу :) Спасибо! Я сделаю это. - person Ali; 02.08.2012

Вам необходимо заполнить Categories и Manufacturers модели.
В отличие от WebForms, здесь нет ViewState, из которого можно загрузить значения.

Самое простое решение — вызвать исходное действие (GET).

person SLaks    schedule 01.08.2012
comment
О, да! Я просто попытался перенаправить на то же действие GET, и это сработало. Спасибо :) - person Ali; 02.08.2012