2017-09-06 3 views
0

Ich habe ein Problem mit der Aktualisierung von ViewModel von PartialView. Teilansicht enthält Geräte zusammen mit der Position, die abhängig von der DropDownList variiert, die von Customer ausgewählt wurde. (Unten stelle ich einen Beispiel-Screenshot vor). Das Problem ist, dass die Eigenschaft Devices im ViewModel (FiscislizationViewModel) nach dem Akzeptieren der Senden-Schaltfläche nicht aktualisiert wird. Hier sind Beispiele für Modelle. Ich bin mir nicht sicher, ob ich versuche, dieses Problem richtig zu lösen.Updates von Teilansicht nicht betroffen zu Modell

namespace TestMVC.ViewModels 
{ 
    public class FiscalizationViewModel 
    { 
     public int CustomerId { get; set; } 
     public string FiscalizationDate { get; set; } 

     public List<DevicesToFiscalizationViewModel> Devices { get; set; } 

     public FiscalizationViewModel() 
     { 
      Devices = new List<DevicesToFiscalizationViewModel>(); 
     } 

     public IEnumerable<DevicesToLocalization> GetSelectedIds() 
     { 
      return (from d in Devices where d.Selected select new DevicesToLocalization() { DeviceId = d.DeviceId, LocalizationId = d.LocalizationId }).ToList(); 
     } 
    } 

    public class DevicesToFiscalizationViewModel 
    { 
     public int DeviceId { get; set; } 

     public string DeviceName { get; set; } 
     public bool Selected { get; set; } 
     public string SerialNumber { get; set; } 

     public int LocalizationId { get; set; } 
     public IEnumerable<Localization> Localizations { get; set; } 

     public DevicesToFiscalizationViewModel() 
     { 
      Localizations = new List<Localization>(); 
     } 
    } 

} 

Hier ist die Methode, die vom Kunden Dropdown Ereignis

public PartialViewResult CustomerChanged(int CustomerId) 
{ 
    var localizations = db.Localizations.Where(i => i.CustomerId == CustomerId).ToList(); 

    var devicesToFsc = (from d in db.Devices 
         select new DevicesToFiscalizationViewModel() 
          { 
           DeviceId = d.DeviceId, 
           DeviceName = d.Name, 
           SerialNumber = d.SerialNumber, 
          }).ToList(); 
    foreach (var item in devicesToFsc) 
    { 
     item.Localizations = localizations; 
    } 

    return PartialView("~/Views/Fiscalizations/EditorTemplates/DevicesToFiscalizationViewModel.cshtml", devicesToFsc); 

//-------------------------------- 
    $("#customerChanged").on("change", function() { 
     $.ajax(
     { 
      url: '/Fiscalizations/CustomerChanged?CustomerId=' + $(this).val(), 
      type: 'GET', 
      data: "", 
      contentType: 'application/json; charset=utf-8', 
      success: function (data) { 
       $("#devicesToFiscalization").html(data); 
      } 
     }); 
    }); 

Dies ist wenig Teil von Views (Fiskalisierung create view)

@model TestMVC.ViewModels.FiscalizationViewModel 
    <table class="table" id="devicesToFiscalization"> 
     <thead> 
      ... 
     </thead> 
       @Html.Partial("~/Views/Fiscalizations/EditorTemplates/DevicesToFiscalizationViewModel.cshtml", Model.Devices) 
    </table> 

PartialView genannt wird:

@model IEnumerable<TestMVC.ViewModels.DevicesToFiscalizationViewModel> 
@foreach(var item in Model) 
{ 
<tbody> 
    <tr> 
     <td style="text-align:center"> 
     <div class="checkbox"> 
      @Html.EditorFor(m => item.Selected) 
     </div> 
    </td> 
    <td> 
     @Html.DisplayFor(m => item.DeviceName) 
    </td> 
    <td> 
     @Html.DisplayFor(m => item.SerialNumber) 
    </td> 
    <td> 
     @Html.DropDownList("LocalizationId", new SelectList(item.Localizations, "LocalizationId", "Name"), "Select", htmlAttributes: new { @class = "form-control", style = "width: 200px;" }) 
    </td> 
    <td> 
     @Html.HiddenFor(m => item.DeviceId) 
    </td> 
    </tr> 
</tbody> 

H ere ist ein Screenshot, wie es aussieht click und hier ist Screenshot von Debugger mit schlechtem Ergebnis bad

+0

Ich vermute, dass die Partiellen die erwarteten Benennungs-Präfixe nicht kennen, die für das Modell benötigt werden, um die Werte an Ihr Modell zu binden. Wie sieht das gerenderte HTML aus? Haben die Teilfelder ein Präfix wie 'Devices.DeviceName' oder nur' DeviceName'? Siehe: https://stackoverflow.com/questions/20693698/mvc4-partial-view-model-binding-during-submit –

+0

Außerdem besteht eine gute Chance, dass Sie Probleme mit der Bindung haben, wenn Sie 'foreach' anstelle von' für (var i = 0; i <...' –

+0

Da Sie ein partielles Formularsteuerelement für eine Auflistungseigenschaft nicht generieren können, wenn Sie das' HtmlFieldPrefix' übergeben, verweisen Sie [diese Antwort] (https://stackoverflow.com/questions/29808573/getting-the-values-from- a-nested-complex-object-das-ist-übergeben-zu-einer-partiellen-view/29809907 # 29809907), aber die richtige Vorgehensweise ist die Verwendung eines 'EditorTempate' für typeof' Devices' - siehe [diese Antwort] (http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943) –

Antwort

0

Basierend auf meiner understating von Ihren Ansichten, Ihre Probleme werden mit verschiedenen Modellen für Hauptansicht und Teilansicht. Sie sollten genau das gleiche Modell in beiden Modellbindungen verwenden, um das Modell auf der Serverseite zu aktualisieren. Halten Sie beide Modelle TestMVC.ViewModels.FiscalizationViewModel oder IEnumerable<TestMVC.ViewModels.DevicesToFiscalizationViewModel>

+0

Danke für Ihre Hilfe, ich habe Ihren Ratschlag umgesetzt und alles funktioniert so wie ich es erwartet habe – ahkmenraha

+0

Also bitte punkten! – Hadee

+0

"Stimmen von denen mit weniger als 15 Ruf abgegeben werden aufgezeichnet, aber nicht die öffentlich angezeigte Punktzahl ändern" – ahkmenraha

0

Es funktioniert :) Im Folgenden werde ich zeigen, wie es nach Änderungen sieht

Hauptansicht:

@model TestMVC.ViewModels.FiscalizationViewModel 
    <div id="devicesToFiscalization"> 
     @Html.Partial("~/Views/Fiscalizations/EditorTemplates/DevicesToFiscalizationViewModel.cshtml", Model) 
    </div> 

Teilansicht:

@model TestMVC.ViewModels.FiscalizationViewModel 
<table class="table"> 
<thead> 
    <tr> 
     <th> 
      Select 
     </th> 
     <th> 
      Name 
     </th> 
     <th> 
      Serial number 
     </th> 
     <th> 
      Localization 
     </th> 
    </tr> 
</thead> 
<tbody> 
    @for (int i = 0; i < Model.Devices.Count; i++) 
    { 
     <tr> 
      <td style="text-align:center"> 
       <div class="checkbox"> 
        @Html.EditorFor(m => m.Devices[i].Selected) 
       </div> 
      </td> 
      <td> 
       @Html.DisplayFor(m => m.Devices[i].DeviceName) 
      </td> 
      <td> 
       @Html.DisplayFor(m => m.Devices[i].SerialNumber) 
      </td> 
      <td> 
       @Html.DropDownListFor(m => m.Devices[i].LocalizationId, new SelectList(Model.Devices[i].Localizations, "LocalizationId", "Name"), "Select", htmlAttributes: new { @class = "form-control", style = "width: 200px;" }) 
      </td> 
      <td> 
       @Html.HiddenFor(m => m.Devices[i].DeviceId) 
      </td> 
     </tr> 
    } 
</tbody> 

und CustomerChanged-Methode:

public PartialViewResult CustomerChanged(int CustomerId) 
    { 
     var localizations = db.Localizations.Where(i => i.CustomerId == CustomerId).ToList(); 
     var Devices = (from d in db.Devices 
         select new DevicesToFiscalizationViewModel() 
         { 
          DeviceId = d.DeviceId, 
          DeviceName = d.Name, 
          SerialNumber = d.SerialNumber, 
         }).ToList(); 

     foreach (var item in Devices) 
     { 
      item.Localizations = localizations; 
     } 

     var fsc = new FiscalizationViewModel(); 
     fsc.Devices = Devices; 

     return PartialView("~/Views/Fiscalizations/EditorTemplates/DevicesToFiscalizationViewModel.cshtml", fsc); 
    } 

=========================================== ==========================

Ich versuche, dies mit EditorFor schreiben, aber ich habe ein Problem mit dem Schreiben richtig die CustomerChanged Methode, die eine Liste der Geräte zurückgibt und diese EditorTemplate nicht erwarten, die wie folgt aussieht:

@model TestMVC.ViewModels.DevicesToFiscalizationViewModel 

<tr> 
    <td style="text-align:center"> 
     <div class="checkbox"> 
      @Html.EditorFor(m => m.Selected) 
     </div> 
    </td> 
    <td> 
     @Html.DisplayFor(m => m.DeviceName) 
    </td> 
    <td> 
     @Html.DisplayFor(m => m.SerialNumber) 
    </td> 
    <td> 
     @Html.DropDownListFor(m => m.LocalizationId, new SelectList(Model.Localizations, "LocalizationId", "Name"), "Select", htmlAttributes: new { @class = "form-control", style = "width: 200px;" }) 
    </td> 
    <td> 
     @Html.HiddenFor(m => m.DeviceId) 
    </td> 
</tr> 

Hauptansicht:

<table class="table" id="devicesToFiscalization"> 
     ... 
     <tbody> 
      @Html.EditorFor(m => m.Devices) 
     </tbody> 
    </table> 
+0

Wie ich in früheren Kommentaren notiert. Die richtige Lösungs-ID, um ein 'EditorTemplate' zu ​​verwenden, für das es gedacht ist, nicht so zu hacken. –

Verwandte Themen