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