12

Ich habe ein paar Fragen über die Namenskonvention für die DisplayTemplates und EditorTemplates in MVC bekam 2.asp.net MVC DisplayTemplates und EditorTemplate Namenskonvention

Wenn ich zum Beispiel ein Kundenobjekt mit einem Kind Liste haben, Konto wie ich:

  • für die Liste der Konten eine Anzeigevorlage erstellen, was heißt die Datei?

  • Wenn ich eine foreach(var c in Model.Accounts) mache, wie rufe ich eine Anzeige Tempel während in der foreach-Schleife? Wenn ich Html.DisplayFor(x => x) innerhalb der Foreach x bin, ist das Modell und nicht in diesem Fall c.

Vielen Dank im Voraus.

Antwort

13

Ja, das ist eine meiner Lieblingsfunktionen, aber es ist ein bisschen verwirrend für einige Dinge.

Also, Erstellen einer Vorlage für jede Klasse, der Name basiert auf der Eigenschaft Name des Typs, also zum Beispiel, wenn Sie eine <% = model.GetType(). Name%> in Ihrer Sicht, können Sie sehen was Ich meine. Wenn Ihre Liste von Konten beispielsweise eine IList ist, würde der Aufruf von .Name auf dem Typ List`1 zurückgeben. Das ist ein zulässiger Dateiname. Wenn Sie also List`1.ascx in Ihren DisplayTemplates-Ordner eingeben, wird er es finden und verwenden. Von dem, was ich sagen kann, wird es die Klassenhierarchie jedoch nicht durchqueren, also wenn Sie zum Beispiel eine IEnumerable `1.ascx Datei dort hineinlegen, wird es sie nicht finden.

in einer Schleife anzuzeigen, benötigen Sie in der Elementvariable in dem Lambda passieren, so in Ihrem Beispiel:

<% foreach (var c in Accounts){ %> 
     <li><%= Html.DisplayFor(x => c) %></li> 
<%}%> 

Hoffnung, das hilft. Paul

+0

Danke für die Antwort funktioniert fantastisch. Nur eine weitere Frage, wenn ich zwei getrennte Objekte mit verschiedenen Child-Listen habe, sagen, dass Accounts und Personen beide den Objektnamen List'1 haben, wie unterscheiden Sie zwischen den beiden? Oder müssen Sie UIHint-Attribute verwenden? – lancscoder

+0

ja, beide werden gleich sein.Ich denke, dass die UIHint funktioniert (habe nicht versucht), aber was Sie auch tun können, ist, dass die Listenvorlage generisch ist (sagen wir, basierend auf IEnumerable, nicht-generisch) und dann DisplayFor innerhalb * seiner * Liste aufrufen und dann Die Listenelemente haben jeweils ihre korrekt typisierte Vorlage. Sie können auch einen expliziten Vorlagennamen als Zeichenfolge in einer der Überladungen übergeben. – Paul

+0

(Bearbeitet, um literalen Backtick in Markdown-Syntax zu beheben.) –

11

Brad Wilsons Blog hier http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html hat ein Beispiel für DisplayTemplates und EditorTemplates für benutzerdefinierte Objekte, und es diskutiert Probleme, die bei der Lösung Ihrer Frage hilfreich sein können.

In Bezug auf Ihre erste Frage ist es wichtig, dass sich Ihre Vorlage in einem Ordner befindet, nach dem das System nach übereinstimmenden Namen sucht, z.

~/Views/ControllerName/DisplayTemplates/TemplateName.aspx & .ascx 
~/Views/Shared/DisplayTemplates/TemplateName.aspx & .ascx 

(Ersetzen DisplayTemplates mit EditorTemplates für die Suchpfade für Editor Vorlagen.)

Die folgenden Vorlagennamen versucht werden, um:

  • TemplateHint von ModelMetadata
  • DataTypeName von ModelMetadata
  • Der Name des Typs (siehe Hinweise unten)
  • Wenn das Objekt ist nicht komplex: „String“
  • Wenn das Objekt komplex ist und eine Schnittstelle: „Objekt“
  • Wenn das Objekt ist komplex und nicht eine Schnittstelle: Recurse durch die Vererbung hiearchy für die Art, jeden Versuch, Typ Name

Ich bin mir nicht sicher über eine Antwort für Ihre zweite Frage. Ist es richtig anzunehmen, dass var c tatsächlich effektiv ist? Und wenn Sie Html.DisplayFor(x => x) schreiben, können Sie auch schreiben Html.DisplayModelFor(c => c)? Oder möchten Sie zum Beispiel `Html.DisplayFor (x => x.AccountName)?

+0

Hallo, danke für den Link ist es nicht ganz meine Fragen allem aber beantworten. Sagen Sie zum Beispiel, ich habe einen Kunden mit einer Kinderliste von Bestellungen. Im Moment, wenn ich eine Liste von Aufträgen anzeigen möchte, habe ich eine Teilansicht von IEnumberable erstellt und Schleife um jedes Objekt erstellen eine Tabelle. Wenn ich das verwenden wollte, würde ich etwas Link Html.RenderPartial ("OrdersTable", Model.Orders) sagen, aber anstatt dies zu verwenden möchte ich Html.DisplayFor (x => x.Orders) sagen und es findet eine Display-Vorlage aber ich weiß nicht, wie man die Anzeigevorlage für eine Liste nennt. – lancscoder

+1

Ich habe meinen Kopf für eine Weile gegen diesen Kopf geschlagen. Ich wusste nicht, dass die Suchpfade wichtig waren. Wird deinen Beitrag bearbeiten, um dies zu verdeutlichen. –

13

Ich weiß, diese Frage ist ein bisschen alt, aber zumindest in MVC 3, wenn Sie eine benutzerdefinierte Anzeige bearbeiten/Vorlage haben eine Liste mit Ihnen im Namen der Vorlage passieren kann:

Html.DisplayFor(model => model.Account, "AccountList") 

dann wäre der Name Ihrer Vorlage "AccountList".

+1

Viel viel viel besser als die angenommene Antwort. Offensichtlich war es zum Zeitpunkt der Beantwortung relevant, aber der Sinn von SO besteht darin, alte Antworten zu aktualisieren oder neuere Antworten wie die Ihre zu erhalten. Vielen Dank. – ppumkin

1

Beim Einrichten einer MVC 3-Anwendung werden die Fremdschlüssel, die Dropdownlisten zum Auswählen eines Elements zulassen sollen, nicht als Dropdown-Elemente, sondern als statische Eingaben gerendert. Dies kann durch Erstellen einer benutzerdefinierten Anzeige und Ansicht für dieses Feld gelöst werden. Wir müssen mit der Erstellung einer benutzerdefinierten Teilansicht beginnen, die in "~/Views/Shared/DisplayTemplates/UserGuid.cshtml" und "~/Views/Shared/EditTemplates/UserGuid.cshtml" enthalten ist. Der Code für eine ist unten zu finden:

@model Guid 

@{ 
    incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB(); 
    incMvcSite.Models.SecUser usr = db.SecUsers.Single(u => u.Guid == Model); 
} 
@usr.Display 

Dies ist eine Anzeige für eine Vorlage, die das Element in der referenzierten Tabelle aussehen wird und es angezeigt werden soll. Wir benötigen auch eine Bearbeitung für die Vorlage wie folgt:

@model Guid 
@{ 
    incMvcSite.Models.MvcSiteDB db = new incMvcSite.Models.MvcSiteDB(); 
    SelectList items = new SelectList(db.SecUsers.OrderBy(i => i.Display).ToList(), "Guid", "Display", Model); 
} 
@Html.DropDownList("", items) 

Die Bearbeitung für Vorlage ist als Dropdown-Liste implementiert. Ursprünglich haben wir statischen HTML-Code verwendet, aber das Problem tritt bei der Implementierung eines "Präfixes" auf. Statischer HTML-Code wird von HTML-Helfern gehandhabt. Daher wird empfohlen, dass Sie HTML.DropDownList() verwenden. Um den MVC-Framework zu zwingen, die neuen Anzeigen und Bearbeiten für Vorlagen zu verwenden, müssen wir unser Modell Artikel Annote eines die folgende Zeile hinzufügen: [UIHint („UserGuid“)]

Das MVC wird bewirken, dass die Anzeige verwenden, und Bearbeiten von Vorlagen mit dem Namen "UserGuid", die nur Teilansichten sind.

-1

Nicht sicher in früheren Versionen aber in MVC5 können Sie UIHint verwenden, um die benutzerdefinierte Anzeige/Editor Vorlage angeben, in dem Modell zu verwenden, wie so,

[UIHint ("CustomAccountList")] public List Accounts {get ; einstellen; }

OR in der Ansicht wie so

Html.DisplayFor (Modell => model.Accounts "CustomAccountList")