Laden...

IHtmlHelper.Display und Collections

Erstellt von WarLorD_XaN vor einem Jahr Letzter Beitrag vor einem Jahr 755 Views
W
WarLorD_XaN Themenstarter:in
113 Beiträge seit 2006
vor einem Jahr
IHtmlHelper.Display und Collections

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

16.835 Beiträge seit 2008
vor einem Jahr

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.

W
WarLorD_XaN Themenstarter:in
113 Beiträge seit 2006
vor einem Jahr

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.

16.835 Beiträge seit 2008
vor einem Jahr

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.

  • Name[] und die Value für einfache Listen (zB wenn man nur eine Liste von Int erwartet)
  • Name[Index].Property und die Value, wenn man mit Objekten arbeitet

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)" />

W
WarLorD_XaN Themenstarter:in
113 Beiträge seit 2006
vor einem Jahr

Alles klar, das hat so funktioniert.

Vielen dank für deine Hilfe.