2012-04-01 3 views
0

を未投げDropDownListFor私のコントローラメソッド次のようになります。<p> </p> ...ここで何が起こっているか確認してください例外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

+0

@SLasks、スタックトレースがあります – Didaxis

+0

'Stylist'が' null 'のような例外があります。 – BrokenGlass

答えて

1

はあなたのPOSTアクションでStylistsプロパティを初期化する必要がありますPOSTアクションが実行された後は、POST要求に送られたものがドロップダウンリスト(Stylistプロパティ)の選択された値であるため、その値が自動的に設定されないため、このプロパティはnullです。

+1

他の回答が同じアイデアをエコーし​​たとしても、この回答は正しい解決策を最も明確に示しています。ありがとう、もう一度、ダーリン!あなたはMVCウィザードです! – Didaxis

3

私の精神的なデバッグスキルを使用すると、モデルを作成せずにPOSTアクションからView()を返していることを教えてください。

+0

@Slasks、何が起こっているのかをよく見られるようにPOSTメソッドの実装を追加しました – Didaxis

+1

@ErOx:私の精神力はほとんど正しい。 POSTからのモデル結合モデルには 'Stylists'はありません。 – SLaks

+0

はい、あなたは正しいです。ありがとう – Didaxis

1

ASP.NET MVCにはViewStateがありません。したがって、ASP.ENT Webformsのようなポストバックの間にDropDownの値リストを保持することはできません。だから、HttpPostアクションメソッドでは、appointmentRequestをビューに戻していますが、Stylistsプロパティはnullであると思います。 appointmentRequestをビューに戻す前に、リロードする必要があります。

+0

これまでにこれを行う必要はありませんでした...モデルがPOST版に与えられると、すべての値がそのまま維持されますか? – Didaxis

+0

@ErOx:ポストアクションメソッドでは、ドロップダウンエレメントの選択肢は利用できません。選択した項目の値を取得します。テキストボックス値etx sice HTMLヘルパーは、それらを保持する隠し変数を作成します。 – Shyju

1

ここで何が起こっているかは、投稿アクションでStylistsがnullであることです。ドロップダウンリストはStylistであり、Stylistsではなく、モデルバインド中にバインドされていません。

appointmentRequestモデルをビューに渡す前に、Stylistsプロパティを再構築する必要があります。

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

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

あなたはあなたのビューでModel.Stylistsを使用して、ビュー内のDropDownListをレンダリングしようとしているので、NREを取得する:あなたが同じビューを再表示する場合

関連する問題