ASP .NET MVC - создание частичного представления работает только для результата действия «Изменить», но не для «Создать».

Я создал частичный вид для использования в представлении «Редактировать» моей модели. Я могу успешно редактировать записи, но при использовании частичного представления для моего представления «Создать» я получаю исключение с нулевой ссылкой.

Это мое частичное мнение:

@model MvcA.Models.Reason       

        @Html.LabelFor(model => model.reason)
        @Html.EditorFor(model => model.reason)

        @Html.LabelFor(model => model.Contract)
        @Html.DropDownList("ContractId",
        new SelectList(ViewBag.Contract as System.Collections.IEnumerable,
       "ContractId","Name",Model.ContractID));

И POST ActionResult:

[HttpPost]
public ActionResult Create(Reason reason)
{
   if (ModelState.IsValid)
            {
                db.Reason.Add(reason);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            //invalid ...

GET Create:

public ActionResult Create()
    {
        ViewBag.Contract = db.Contract.OrderBy(g => g.Name).ToList();
        var reason = new Reason();
        return View(reason);
    } 

После ввода / выбора допустимых значений отправка формы приведет к выходу Visual Studio из списка DropDownList, найденного в частичном представлении, с ошибкой «NullReferenceException was unhandled».

Как определить причину нулевой ошибки? (Я новичок в MVC)

ОБНОВЛЕНИЕ: ошибка связана с методом [HttpPost] Create в моем контроллере. Я назвал входной класс, используя то же имя, что и одно из полей в модели ... похоже, это нарушило программу с исключением нулевой ссылки.


person John M    schedule 08.02.2011    source источник


Ответы (2)


Когда вы отправляете сообщение в действие создания, является ли модель действительной или недействительной, когда вы получаете исключение? Если он недействителен, скорее всего, вы возвращаете представление для отображения формы с проверкой, но не хватает некоторых требований для этого представления (например, ViewBag.Contract заполняется). Если вы покажете оба действия Create полностью, это будет легче проверить.

person Cymen    schedule 08.02.2011
comment
Я добавил действие создания «ПОЛУЧИТЬ». - person John M; 09.02.2011
comment
Ключ - это другая часть действия создания POST - заполняете ли вы ViewBag.Contract так же, как в действии GET? Вам нужно ViewBag.Contract = db.Contract.OrderBy(g => g.Name).ToList(); в методе создания POST в той его части, которая повторно отображает представление, если модель недействительна. - person Cymen; 09.02.2011

Когда вы визуализируете свой частичный вид, попробуйте:

<% Html.RenderPartial("YouPartialViewName", new Reason()); %>
person Melursus    schedule 08.02.2011