Hallo,
es geht um ASP.NET Core MVC auf Basis von .NET 6.
Ich habe das Problem, dass die IHtmlHelper.Display Methode bei mir nicht mit Collections funktioniert.
Ich habe in meinem View folgenden Code:
@for (var index = 0; index < Model.Products.Count; index++)
{
@Html.DisplayFor(m => m.Products[index].Id)
@Html.Display($"Products[{index}].Id")
}
Die DisplayFor Methode funktioniert einwandfrei.
Die Display Methode kann nicht mit dem Index-Operator umgehen, sondern gibt nichts aus.
Ist das "Works as Designed", oder mache ich hier irgendwo einen Fehler?
Das Model der oben erwähnten View sieht folgendermaßen aus:
public class ProductsViewModel
{
public List<Product> Products { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
}
Falls sich jemand fragt warum ich nicht einfach die DisplayFor Methode verwende:
Ich habe einen TagHelper indem ich nur die die nicht-generische IHtmlHelper Komponente verwenden kann.
Der obige Code dient nur dazu mein Problem besser darzustellen.
Vielen Danke für eure Hilfe,
Xan
Bekanntes Thema, solltest bei der Google Recherche über entsprechende Themen gestolpert sein.
Beides sind aber nur Methoden, um ein Label dynamisch zu erzeugen.
Erzeug doch das Label einfach direkt mit HTML Code? Ist auch 100 mal effizienter als das ständig in einer Runtime in einer Schleife zu erzeugen.
Man braucht quasi kein einziges dieser Form-Helper in ASP.NET. Alles nur Komfort, der aber auch gerendert werden muss - wenn man das überhaupt so nennen kann.
Persönlich find ich das kein Komfort, macht vieles unnötig komplex. HTML ist bei sowas 1000 mal einfacher zu handlen.
Wir hier im Forum verwenden bei sowas immer folgenden Grundaufbau:
<input class="input" type="text" name="@(nameof(ForumPostReplySubmitModel.Topic))"
value="@(Model.SubmitModel.Topic)" maxlength="@(LimitConstants.Forum.PostTopicMaxLength)" />
Wir haben nicht einen einzigen Helper für Forms.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hab ich ehrlich gesagt nie daran gedacht, dass ich ja die inputs/labels/displays auch komplett selbst generieren kann. Obwohl ich andere HTML sachen ja bereits komplett selbst generiere 🙈.
Manchmal ist man so auf eine Methode versteift, dass man gar nicht erst daran denkt es auf andere Art zu versuchen.
Ich werd mir das mal ansehen.
Wie dann die id und name tags der HTML Elemente gesetzt werden müssen, dass dann das Model Binding noch funktioniert, muss ich mir noch ansehen. Das steht aber sicher in der Doku.
Danke für deine Antwort und deine Anregung das komplett anders zu machen.
IDs sind eindeutige Bezeichner für den DOM, spielt für Form Posts keine Rolle; werden auch nicht mit gesendet.
Form Names arbeiten mit dem name-Attribut
, müssen bei Collections nach Name[] aufgebaut werden, gibt zwei Schreibweise.
Du machst das ja schon
@Html.Display($"Products[{index}].Id")
<input
type="checkbox"
name="@(nameof(MySubmitModel.MyCollectionProperty))[]" value="@(myObject.Id)" />
oder als Objekt
<input
type="checkbox"
name="@(nameof(MySubmitModel.MyCollectionProperty))[].Id" value="@(myObject.Id)" />
bzw
<input
type="checkbox"
name="@(nameof(MySubmitModel.MyCollectionProperty))[@(myObject.Id)].Id" value="@(myObject.Id)" />
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Alles klar, das hat so funktioniert.
Vielen dank für deine Hilfe.