DropDownList для метания ArgumentNullException - PullRequest
0 голосов
/ 01 апреля 2012

Не уверен, что здесь происходит ...

Мои методы контроллера выглядят так:

[HttpGet]
public ActionResult RequestAppointment()
{
    var appointmentRequest = new AppointmentRequest
    {
        Stylists = _repository.Stylists // <-- Debugging shows that Stylists IS being populated here
    };

    return View(appointmentRequest);
}

[HttpPost]
public ActionResult RequestAppointment(AppointmentRequest appointmentRequest)
{
    if(ModelState.IsValid)
    {
        // Process...
        return RedirectToAction("Confirmation");
    }
    return View(appointmentRequest);
}

Форма выглядит так:

@model MyDomain.Models.AppointmentRequest

@using(Html.BeginForm("RequestAppointment", "Appointment" FormMethod.Post))
{
    // This following line throws the exception:
    @Html.DropDownListFor(x => x.Stylist,
        Model.Stylists.Select(x => new SelectListItem{ Text = x.Name, Value = x.Name })))

    <input type="submit" value="Make Request" />
}

выпадающий список заполняется формой с правильным текстом и значениями.Но когда форма отправлена, возникает исключение.Что происходит?

Трассировка стека:

[ArgumentNullException: Value cannot be null.
Parameter name: source]
   System.Linq.Enumerable.Select(IEnumerable`1 source, Func`2 selector) +6396316
   ASP._Page_Views_Appointment_RequestAppointment_cshtml.Execute() in c:\Projects\OasisSalon\OasisSalon.Mvc\Views\Appointment\RequestAppointment.cshtml:9
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +280
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +104
   System.Web.WebPages.StartPage.ExecutePageHierarchy() +143
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +157
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +384
   System.Web.Mvc.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() +33
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) +825460
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +265
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +825488
   System.Web.Mvc.Controller.ExecuteCore() +159
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +335
   System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
   System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +54
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375

Ответы [ 4 ]

3 голосов
/ 01 апреля 2012

Мои навыки психической отладки говорят мне, что вы возвращаете View() из действия POST без создания модели.

1 голос
/ 02 апреля 2012

Вы должны инициализировать свойство Stylists в своем действии POST, если вы намерены повторно отобразить то же представление:

[HttpPost]
public ActionResult RequestAppointment(AppointmentRequest appointmentRequest)
{
    if(ModelState.IsValid)
    {
        // Process...
        return RedirectToAction("Confirmation");
    }

    appointmentRequest.Stylists = _repository.Stylists;
    return View(appointmentRequest);
}

Вы получаете NRE, потому что вы пытаетесь отобразить DropDownList в своем представлении, используя Model.Stylists в своем представлении, но очевидно, что это свойство имеет значение null после выполнения действия POST, поскольку вы никогда не назначали его, и его значение не заполняется автоматически, потому что все, что отправляется в запрос POST, это выбранное значение раскрывающегося списка (свойство Stylist).

1 голос
/ 01 апреля 2012

Я предполагаю, что здесь происходит то, что Stylists является нулевым в вашем действии Post. Он не привязывается во время привязки модели, так как раскрывающийся список предназначен для Stylist, а не Stylists.

Вам потребуется перестроить свойство Stylists перед передачей модели appointmentRequest в представление.

1 голос
/ 01 апреля 2012

ASP.NET MVC не имеет ViewState. Таким образом, он не может хранить список значений DropDown между постбеками, как это делает ASP.ENT Webforms. Так что, я думаю, в методе HttpPost Action вы возвращаете appointmentRequest в View, но свойство Stylists имеет значение null. Возможно, вам необходимо перезагрузить его, прежде чем вернуть appointmentRequest обратно в представление.

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