2017-11-15 3 views
0

データを入力する必要があるアプリケーションがあり、データの送信時にデータがデータベースに保存されます。データベースをチェックインすると、入力は正常に保存されていますが、httppostの後にページをリロードすると例外が発生します。 DBで結合、ドロップダウンリストの値を取得するためにSystem.Web.Mvc.dllでSystem.ArgumentNullExceptionが発生しました

@Html.DropDownList("LineID", new SelectList(Model.dropConfig, "LineID", "LineID"), "-- Select LineID --", new { required = true, @class = "form-control" }) 

コントローラコード: 私はで例外を取得しています

[ActionName("DetailsForm")] 
     [HttpGet] 
     public ActionResult DetailsForm() 
     { 
      try 
      { 
       var model = new DetailsViewModel() { dropConfig = floorService.DropDownList().ToList() }; 
       return View("DetailsForm", model); 

      } 
      catch (Exception ex) 
      { 
       return View("_error"); 
      } 
     } 

コントローラコードのポストhttpに:例外の

[ActionName("DetailsForm")] 
     [HttpPost] 

     public ActionResult DetailsForm(DetailsViewModel model, FormCollection form) 
     { 

      DetailsConfiguration detailsConfig = new DetailsConfiguration(); 

      detailsConfig.LineID = Convert.ToString(form["LineID"]); 
      //Similary for other fields 
      floorService.SaveDetails(detailsConfig); 

      ModelState.Clear(); 
      ViewBag.message = "Success"; 

      return View("DetailsForm",model); 

     } 

スナップショット: enter image description here

答えて

1

ビューコードはModel.dropConfigを使用してドロップダウンリストにSelectListを作成し、ビューに戻る前にdropConfigプロパティ値を設定していないためです。

覚えていること、Httpはステートレスです。したがって、GETアクションでdropConfigプロパティ値を設定しても、HttpPostアクション内では使用できなくなります。フォームを送信すると、サーバーに対する全く新しい要求です。

dropConfigプロパティを再度読み込んで修正することができます。

model.dropConfig = floorService.DropDownList().ToList(); 
return View(model); 

しかし、理想的に、あなたはP-R-G patternを次のようする必要があります。 リダイレクト - - ゲット

P-R-Gは、ポストの略です。したがって、http postアクションメソッドにフォームを送信すると、リダイレクト応答が返され、ブラウザはそのアクションメソッドに対して新しいGET呼び出しを行います。

RedirectToActionメソッドを使用すると、リダイレクト応答を返すことができます。

floorService.SaveDetails(detailsConfig); 
return RedirectToAction("DetailsForm"); 

これはDetailsFormアクションメソッドのURLに設定Locationヘッダでブラウザに302応答を送信し、ブラウザはその新しいGET要求を行います。

リダイレクトレスポンスでは、ViewBagが機能しません。したがって、TempDataの使用を検討することもできます。 TempDataは、2つの要求の間で転送するために使用できます。

TempData["message"] = "Success"; 
return RedirectToAction("DetailsForm"); 

今、あなたはDetailsFormアクションメソッドまたはそのことにより、レンダリングされたビューでTempData["message"]を読むことができます。

たとえば、あなたは私がRedirectToAction( "DetailsForm")を返す `試してみました。この

@if (TempData["message"]!=null) 
{ 
<div class="alert alert-success" id="alert"> 
     <button type="button" class="close" data-dismiss="alert">x</button> 
    <strong>Success! </strong>@TempData["message"] 
    </div> 
} 
+0

のように(アクションメソッドをGET DetailsFormによってレンダリング)ビューでそれを読むことができます;'、それが正常に動作します:)しかし、TempDataをまだ私のための成功メッセージを表示していません。 –

+0

'TempData [" message "]'にアクセスすると、それが動作するはずです。次のリクエストに対してのみ有効です。どうやってそれを読んでいるの? – Shyju

+0

私は 'TempData [" message "] =" Success ";' –

関連する問題