2012-04-01 78 views
0

不知道这是怎么回事...上DropDownListFor抛出ArgumentNullException

我的控制器方法是这样的:

[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 
+0

读取堆栈跟踪。您未向我们展示任何在提交表单时运行的代码。 – SLaks 2012-04-01 18:53:15

+0

@SLasks,有堆栈轨迹 – Didaxis 2012-04-01 18:58:21

+0

Exception绝对看起来像'Stylist'是'null' – BrokenGlass 2012-04-01 19:01:49

回答

1

,如果你打算重新显示了同样的观点,您必须初始化您的POST操作的Stylists财产但显然,在执行POST操作后,此属性为空,因为您从未分配它并且其值不会自动填充,因为发送到POST请求的所有内容都是下拉列表(Stylist属性)的选定值。

+1

尽管其他答案也回应了相同的想法,但这个答案最清楚地说明了正确的解决方案。再次感谢Darin!你是MVC向导! – Didaxis 2012-04-02 12:31:57

3

我的心理调试技巧告诉我,你回来从POST操作View()而无需创建一个模型。

+0

@Slasks,我已经添加了更多的POST方法的实现,所以你可以更好地看到发生了什么 – Didaxis 2012-04-01 18:59:02

+1

@ErOx:我的心灵力量是大多是正确的POST的模型绑定模型没有'Stylists'。 – SLaks 2012-04-01 19:25:51

+0

是的你是对的。谢谢 – Didaxis 2012-04-01 19:28:26

1

ASP.NET MVC没有ViewState。因此它不能像ASP.ENT Webforms那样在回发中保留DropDown列表的值。所以我猜,在HttpPost Action方法中,您将appointmentRequest返回给View,但Stylists属性为null。在将appointmentRequest返回到视图之前,您可能需要重新加载它。

+0

我以前从来没有这样做过......当模型被赋予POST版本时,所有的值都保留在原地,不是吗? – Didaxis 2012-04-01 19:11:25

+0

@ErOx:下拉式元素中的可用选项在您的发布后操作方法中不可用。您将获得所选项目的值,TextBox值etx sice HTML助手创建一个隐藏变量来保存这些值。 – Shyju 2012-04-01 19:13:33

1

我猜这里发生的事情是Stylists在您的发布操作中为空。它在模型绑定过程中没有被绑定,因为下拉列表是Stylist,而不是Stylists

在将appointmentRequest模型传递给视图之前,您需要重建Stylists属性。

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

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

你得到一个NRE因为你正试图在您的视图中使用Model.Stylists呈现在你看来一个DropDownList:

相关问题