Wenn das Modell eine Liste von Objekten ist, dann erstellt @Html.LabelFor model => model[i].member)
ein leeres for
Attribut. Der DisplayName funktioniert ordnungsgemäß, Modellbindung funktioniert auch einwandfrei. Das einzige, was nicht funktioniert, ist das for
Attribut.Razor: Wenn das Modell List <> ist, dann erzeugt @ Html.LabelFor ein leeres "for" -Feld
Im Folgenden finden Sie zwei Versionen des MVC-Codes. Die ersten drei Codefragmente sind für die Kombination aus Modell, Controller und Ansicht, die nicht funktioniert (das Modell ist eine Liste). Der zweite Satz von 3 Code-Snippets funktioniert. Diesmal ist die Liste in ein Objekt eingeschlossen.
Was fehlt mir?
Modell:
public class ViewModel {
public bool ClickMe { get; set; }
}
Controller:
public ActionResult LabelForViewModel() {
List<ViewModel> model = new List<ViewModel>() {
new ViewModel() { ClickMe = true}
};
return View(model);
}
Ausblick:
@model List<ModelBinding.Models.ViewModel>
// form code removed for brevity
@for (var i = 0; i < Model.Count; i++) {
<div class="form-group">
@Html.LabelFor(model => model[i].ClickMe)
<div class="col-md-10">
@Html.EditorFor(model => model[i].ClickMe, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model[i].ClickMe, "", new { @class = "text-danger" })
</div>
</div>
}
Markup:
<div class="form-group">
<label for="">ClickMe</label>
<div class="col-md-10">
<input name="[0].ClickMe" class="form-control check-box" type="checkbox" checked="checked" value="true" data-val-required="The ClickMe field is required." data-val="true"><input name="[0].ClickMe" type="hidden" value="false">
<span class="field-validation-valid text-danger" data-valmsg-replace="true" data-valmsg-for="[0].ClickMe"></span>
</div>
</div>
Bitte beachten Sie, dass das for-Feld leer ist und die Eingabe kein ID-Feld hat (das wird im "for" -Feld verwendet).
Ich habe ein Wrapper-Modell, das eine Liste von Objekten enthält, den Controller und die Ansicht geändert und dann funktioniert es gut. In diesem Fall ist das Feld "for" korrekt ausgefüllt und alles funktioniert wie erwartet.
public class ListWrapper {
public List<ViewModel> ViewModels { get; set; }
}
Ausblick:
@for (var i = 0; i < Model.ViewModels.Count; i++) {
<div class="form-group">
@Html.LabelFor(model => model.ViewModels[i].ClickMe)
<div class="col-md-10">
@Html.EditorFor(model => model.ViewModels[i].ClickMe, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.ViewModels[i].ClickMe, "", new { @class = "text-danger" })
</div>
</div>
}
Markup:
<div class="form-group">
<label for="ViewModels_0__ClickMe">ClickMe</label>
<div class="col-md-10">
<input name="ViewModels[0].ClickMe" class="form-control check-box" id="ViewModels_0__ClickMe" type="checkbox" checked="checked" value="true" data-val-required="The ClickMe field is required." data-val="true"><input name="ViewModels[0].ClickMe" type="hidden" value="false">
<span class="field-validation-valid text-danger" data-valmsg-replace="true" data-valmsg-for="ViewModels[0].ClickMe"></span>
</div>
</div>
So scheint es, dass das for
Attribut leer ist nur, wenn das Modell eine Liste von Objekten ist.
Ist dies ein bekanntes Problem? Oder vielleicht vermisse ich etwas?
@GabrielLuci, das Modell keine Eigenschaft enthält namens 'Item' so würde dies nicht funktionieren und könnte binden nie –
zu etwas Ja, ich merke, dass jetzt . [MSDN] (https://msdn.microsoft.com/en-us/library/0ebtbkkc (v = vs.110) .aspx? Cs-save-lang = 1 & cs-lang = csharp) beschreibt eine Eigenschaft 'Item', aber es wird nur über den Indexer verfügbar gemacht. –
Mit Linq konnte er 'Model.ElementAt [i] .ClickMe' verwenden. Das würde wahrscheinlich eine ID wie "ElementAt_0__ClickMe" erzeugen, vielleicht? Linq ist hier wahrscheinlich nicht ideal. –