2016-03-24 4 views
1

私はページにViewModelを表示するViewを持っています。ユーザーがボタンを押してCSVファイルを作成し、そのファイルに電子メールで送信することを許可します。私はPOStが動作しているが、ページには明らかに多くの行が表示されているにもかかわらず、返されるViewModelは常に空です。ViewBag ViewModelをBeginFormのBeginForm PostメソッドのControllerに戻します。

これは、問題のビューの一部である:

public ActionResult SubmitExcel(List<ViewModels.AllRecognitionViewModel> AllRecognitions) 
    { 
     ViewBag.NoSearch = "block"; 
     ViewBag.SupervisorSearch = "none"; 
     ViewBag.DepartmentSearch = "none"; 
     ViewBag.EmployeeSearch = "none"; 

     DataTable dtAllRecognitions = Base.SQLHelper.ConvertListToDataTable(AllRecognitions.ToList()); 
     DataSet dsAllRecognitions = new DataSet(); 
     dsAllRecognitions.Tables.Add(dtAllRecognitions); 
     FHSBase.FHS.DataHelper.SendMeExcelFile(dsAllRecognitions, "Recognitions", CurrentUser); 

     ViewModels.AllRecognitionBigViewModel AllRecognitionBigViewModel = new ViewModels.AllRecognitionBigViewModel(); 
     AllRecognitionBigViewModel.AllRecognitionViewModel = null; 
     Models.DateRange DateRange = new Models.DateRange(); 
     DateRange.fromDate = DateTime.Today.Date; 
     DateRange.toDate = DateTime.Today.Date; 
     AllRecognitionBigViewModel.DateRange = DateRange; 
     ViewBag.AllRecognitionBigViewModel = AllRecognitionBigViewModel; 

     List<SelectListItem> empList = new List<SelectListItem>(); 
     string VPath = "Index"; 
     return View(VPath, empList); 

    } 

「AllRecognitions」ビューモデルのActionResultが、ISNにおいて空である:

<table style="width:99%" cellpadding="3" class="ContentTable" border="1" align="center"> 

    @using (Html.BeginForm("SubmitExcel", "AllRecognition", new { AllRecognitions = ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel }, FormMethod.Post, new { id = "submitExcel" })) 
    { 
     <tr> 
      <td style="padding:3px;"> 
       <input type="submit" name="BtnSubmitExcel" id="BtnSubmitExcel" value="Export to Excel" /> 
      </td> 
     </tr> 
    } 

    <tr style="background-color:#5D7B9D;color:white;"> 
     <th style="width:4%;padding:3px;font-size:12px;">Date</th> 
     <th style="width:8%;padding:3px;font-size:12px;">Employee</th> 
     <th style="width:8%;padding:3px;font-size:12px;">Recognized By</th> 
     <th style="width:6%;padding:3px;font-size:12px;">5-Star Standard</th> 
     <th style="width:70%;padding:3px;font-size:12px;">Description</th> 
     <th style="width:4%;padding:3px;font-size:12px;">Points</th> 
    </tr> 

    @{ 

     if (ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel != null) 
     { 
      foreach (Recognition.ViewModels.AllRecognitionViewModel item in ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel) 
      { 
       @:<tr> 
        @:<td style="width:4%;padding:3px;font-size:12px;">@item.Date</td> 
        @:<td style="width:8%;padding:3px;font-size:12px;">@item.Employee</td> 
        @:<td style="width:8%;padding:3px;font-size:12px;">@item.RecognizedBy</td> 
        @:<td style="width:6%;padding:3px;font-size:12px;">@item.FiveStarStandard</td> 
        @:<td style="width:70%;padding:3px;font-size:12px;">@item.Description</td> 
        @:<td style="width:4%;padding:3px;font-size:12px;">@item.Points</td> 
       @:</tr> 
       } 



     } 
    } 

</table> 

これは、POSTメソッドを受信し、コントローラ側でありますビュー自体は空ではありません。どのように現在のビューモデルをViewに表示されている現在の値でActionResult(SubmitExcel)に戻すことができますか?

+0

あなたはAllRecognitionsのTempDataが必要です。あなたがPOSTするときにあなたのためにそこにあります。必要に応じてViewBagをレンダリングに使用することはできますが、フォーム入力要素と一致させない限り、失われます。 TempDataはメモリ内のラウンドトリップに耐え、フォームに依存しません。 –

答えて

0

これは機能しますか?それは別のアプローチです。ビューで何も操作せず、Excelにエクスポートしたいだけなので、結果をViewBagの代わりにTempDataに入れてPOSTで取得してみませんか? TempDataはその1回の旅行でメモリが良好です。

だから、あなたの最初のコントローラでは、レンダリングを実行します。彼らは優れて提出する際

TempData["AllRecognition"] = ThisIsMyAllRecognitionViewModelData; 

はその後、そのデータは一時にまだあります。

public ActionResult SubmitExcel() 
    { 
var MyDataMadeIt = TempData["AllRecognition"]; 
// do some stuff 
} 
+1

これはうまくいって実装が非常に簡単でした!ありがとう! – pldiguanaman

0

あなたのフォームは空です。したがって、サーバーにはデータは送信されません。

フォームを送信すると、ページ全体がサーバーに送信されません。 (サーバーはHTMLからあなたが望む値を得る方法を知っていますか?)フォーム要素からキー/値のペアを送信します。そして、フォーム要素は1つしかありません:

<input type="submit" name="BtnSubmitExcel" id="BtnSubmitExcel" value="Export to Excel" /> 

したがって、そのキー/値がサーバーに送信されます。

最初にする必要があるのは、サーバーに送信するデータの周りにフォームをラップすることです。基本的にテーブル全体の周り。

次に、実際のフォーム要素を送信する必要があります。ページ上のテキストは使用可能なデータではなく、単なるページコンテンツです。モデルはList<ViewModels.AllRecognitionViewModel>なので、ループを簡単に変更してモデルを作成することができます。だからではなく、この:

foreach (Recognition.ViewModels.AllRecognitionViewModel item in ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel) 

あなたはこのことを望む:あなたのページに現在のUXを変更しないよう

for (var i = 0; i < ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel.Count(); i++) 

フォーム要素は、hiddenすることができます。 たぶんこのような何か:

@Html.HiddenFor(x => x[i].Date) 

または多分:

@Html.HiddenFor(x => x.AllRecognitionViewModel[i].Date) 

私ははるかに慣れて、このためのモデルの代わりに、ViewBagを使用することによ以来、私は実際に、ここにビットを推測しています。 (代わりに使用したいと思うかもしれませんが、おそらく簡単になります)ここではサーバー側のコードで何が起こっているのかを正確に判断するために、デバッグを行う必要があります。だから、

<input type="hidden" name="AllRecognitionViewModel.Date[0]" value="..." /> 

、上記@Html.EditorFor提案は動作しない場合、あなたはいつでも行うことができます。

最終的に、あなたがあなたのクライアント側コードで見るために探していることはこれと同様の要素です手動でループでは、次のようになります。

<input type="hidden" name="AllRecognitionViewModel.Date[@i]" value="@ViewBag.AllRecognitionBigViewModel.AllRecognitionViewModel[i].Date" /> 

注目すべき重要なことはname属性です。これらのキー/値ペアの「配列」をサーバーに送信することによって、モデルバインダーはList<ViewModels.AllRecognitionViewModel>を構築できるはずです。

+0

私はBeginFormポストをテーブル全体にラップすることに決めましたが、まだコントローラに空のビューモデルがあります。私は表示された両方のhiddenforメソッドを試してみましたが、IEnumerableのリストでは使用できないというエラーメッセージが表示されます。 ViewBag ViewModelをコントローラに戻すことができないということは私には奇妙に思えます。 – pldiguanaman

+0

@pldiguanaman:コントローラにデータを戻すことができます。あなたはそのデータをフォーム要素に入れるだけです。私は答えの終わり近くに別の可能な提案を加えました。 '@ H​​tml.HiddenFor'アプローチがうまくいかない場合は、フォーム要素を手動で構築するだけで済みます。 – David

関連する問題