Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
IHtmlHelper.Display und Collections
WarLorD_XaN
myCSharp.de - Member



Dabei seit:
Beiträge: 111
Herkunft: Austria

Themenstarter:

IHtmlHelper.Display und Collections

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
WarLorD_XaN
myCSharp.de - Member



Dabei seit:
Beiträge: 111
Herkunft: Austria

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.852

beantworten | zitieren | melden

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)" />
private Nachricht | Beiträge des Benutzers
WarLorD_XaN
myCSharp.de - Member



Dabei seit:
Beiträge: 111
Herkunft: Austria

Themenstarter:

beantworten | zitieren | melden

Alles klar, das hat so funktioniert.

Vielen dank für deine Hilfe.
private Nachricht | Beiträge des Benutzers