2016-03-24 16 views
1

Sayfada ViewModel görüntüleyen bir Görünüm var. Kullanıcının daha sonra e-postayla gönderildiği bir CSV dosyası oluşturmak için bir düğmeye basmasına izin vermek istiyorum. POSt çalışmam var ancak ViewModel'ın geri gönderilmesi, sayfanın açıkça birçok satır göstermesine rağmen her zaman boştur.ViewBag ViewModel'i ViewBag ViewModel uygulamasına geri dön ViewSonic uygulamasında View Post yöntemi

Bu, söz konusu adlı bir parçasıdır:

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" görünümü modeli ActionResult ancak ISN boştur:

<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> 

Bu POST yöntemini alma kontrol tarafı Görünümün kendisinde boş değil. Geçerli görünüm modelini, Görünüm'de görülen mevcut değerlerle ActionResult'a (SubmitExcel) nasıl geri döndürebilirim?

+0

AllRecognitions'larınız için TempData istersiniz. POST'unuz olduğunda orada olacak. İsterseniz ViewBag'ı render için kullanabilirsiniz, ancak form giriş elemanları ile eşleşmedikçe kaybolur. TempData hafızadaki gidiş gelişinden kurtulur ve forma bağlı değildir. –

cevap

0

Bu sizin için çalışacak mı? Bu farklı bir yaklaşım. Görünüşünüzde hiçbir şeyi manipüle etmediğiniz ve sadece Excel'e aktarmak istediğiniz için, sonuçlarınızı yalnızca ViewBag yerine TempData'ya yazmanız ve sonra da POST üzerine almanız gerekmez mi? TempData, bu geri dönüş için bellekte iyidir.

Yani, ilk denetleyicisi, işlemek faydalıdır: excel için gönderdiklerinde

TempData["AllRecognition"] = ThisIsMyAllRecognitionViewModelData; 

Sonra o veri Temp hala.

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

Bu çalıştı ve uygulanması çok kolay oldu! Teşekkürler! – pldiguanaman

0

Formunuz boş. Bu nedenle sunucuya hiç veri gönderilmiyor.

Bir form gönderdiğinizde, sunucuya tüm sayfa göndermez. (Sunucu, HTML ile ne yapmak istediğinizi bilebilmek için ne yapması gerektiğini bile bilebilir?) Form öğelerinden anahtar/değer çiftleri gönderir. Ve sadece bir form öğeniz var: Sunucuya yalnızca bir anahtar/değer gönderiliyor.

Yapmanız gereken ilk şey, formunuzu sunucuya göndermek istediğiniz verilere sarmaktır. Yani temelde tüm masanın etrafında.

Ardından, gerçek form öğelerini yamanız gerekir. Sayfadaki metin kullanılabilir veriler değil, sadece sayfa içeriğidir. Model bir List<ViewModels.AllRecognitionViewModel> olduğundan, döngü için basit bir değişiklik yaparak bunu yapabilmeniz gerekir. Bunun yerine bu:

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

Bunu isteyeyim: Eğer sayfasında güncel UX'i değişikliği yoktur

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

form elemanları, hidden olabilir. Böyle Belki şey:

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

ya da belki:

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

ben çok daha alışkın bunun için ViewBag yerine modelini kullanmaya olduğumdan beri Aslında burada biraz tahmin ediyorum . (Bunun yerine kullanmayı denemek isteyebilirsiniz, muhtemelen işleri daha basit hale getirecektir.) Burada sunucu tarafı kodunda neler olup bittiğini tam olarak belirlemek için bazı hata ayıklama yapmanız gerekebilir. Yukarıdaki @Html.EditorFor öneri işe yaramazsa

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

Yani, her zaman yapabilirsiniz:

Sonuçta, ne senin istemci tarafı kodunda görmeye çalışıyoruz buna benzer unsurlardır manuel olarak.döngü içinde böyle görünebilir:

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

fark anahtar şey name niteliktir. Anahtar/değer çiftlerinin bu "dizilerini" sunucuya göndererek, model bağlayıcısı List<ViewModels.AllRecognitionViewModel>'u yapabilmelidir.

+0

BeginForm yazısını tüm masa etrafında sarmaya karar verdim, ancak denetleyicide hala boş bir görünüm modeli var. Her iki gizleme yöntemini de görüntüledim ancak bir hata mesajı alıyorum, bir IEnumerable listesi ile kullanılamaz. ViewBag Viewmodel'i tekrar kontrolöre geçiremediğim için garip geliyor. – pldiguanaman

+0

@pldiguanaman: Verileri denetleyiciye geri gönderebilirsiniz. Bu verileri form öğelerine sahip olmanız yeterlidir. Yanıtın sonuna doğru başka bir öneri ekledim. Eğer '@ Html.HiddenFor' yaklaşımları işe yaramazsa, her zaman form öğelerini manuel olarak oluşturabilirsiniz. – David

İlgili konular