2010-12-08 8 views
1

Wir tun unser Bestes, um nicht RenderPartial zu verwenden, sondern stattdessen EditorFor und DisplayFor in 100% der Fälle zu verwenden. Es gibt jedoch ein Szenario, das wir bisher nicht lösen konnten: Wenn die Teilansicht das gesamte ViewModel benötigt, oder mit anderen Worten, wenn es Html.DisplayFor(m => m, "MyTemplateThatNeedsTheEntireViewModel") sein muss. Es funktioniert gut, wenn es Html.DisplayFor(m => m.Prop, "MyTemplateThatOnlyNeedsTheOneProperty") ist, aber wir können nicht das gesamte Ansichtsmodell in geben.Ein komplettes ViewModel in ein DisplayTemplate übergeben?

Gibt es eine Möglichkeit, dies zu erreichen, die sowohl mit DisplayFor und EditorFor arbeiten?

Was ich jetzt sehe ist, dass entweder nichts (oder vielleicht Leerzeichen) zu meinem Markup gerendert wird. Sowohl der Compiler als auch ReSharper scheinen jedoch zu glauben, dass meine Syntax gut ist. Das Ändern meines Codes zum Aufrufen von RenderPartial funktioniert einwandfrei, aber das versuche ich zu vermeiden.

Ich versuche diese drei Zeilen. Die RenderPartial funktioniert perfekt, die EditorFors nicht funktionieren (eventuell Markup ist eine leere Zeichenfolge oder Leerzeichen):

<% Html.EditorFor(m => m, "RetailPriceRequests/PriceRequest/PriceRequestLoadGrid"); %> 
<%= Html.EditorFor(m => m, "RetailPriceRequests/PriceRequest/PriceRequestLoadGrid") %> 
<% Html.RenderPartial("~/Views/Shared/EditorTemplates/RetailPriceRequests/PriceRequest/PriceRequestLoadGrid.ascx", Model); %> 
+0

was ist die Art von jedem des DisplayTemplates? – hunter

+0

Sie sind sehr benutzerdefinierte ViewModels. Zum Beispiel haben wir ein 'BusinessDetailsViewModel', wo wir es an eine' BusinessSummary' (immer-auf-Bildschirm-Info) und 'BusinessDetails' (Inhalt einer von vielen Registerkarten) übergeben und dann verschiedene Eigenschaften aus dem' BusienssDetailsViewModel' übergeben werden in Anzeige/Editor-Vorlagen in zusätzlichen Registerkarten. – Jaxidian

Antwort

1

Wenn Ihr DisplayTemplate ist:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ExampleModel>" %> 

DisplayFor(m => m, "ExampleModel") 

funktionieren sollte

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ExamplePropertyModel>" %> 

DisplayFor(m => m.ExampleProperty, "ExamplePropertyModel") 

sollte Arbeit

Ein Problem könnte sein, dass etwas null ist, in diesem Fall es wahrscheinlich sollte den Blick nicht zu schlagen werden, aber man kann durch Schreiben dieses Problem umgehen:

RenderPartial("ExampleModel", Model ?? new ExampleModel()); 

oder

RenderPartial("ExampleModel", 
    (Model ?? new ExampleModel() { ExampleProperty = new ExampleProperty() }) 
     .ExampleProperty ?? new ExampleProperty()); 
+0

Ihr allererstes Beispiel ist genau das, was ich versuche zu tun, und kein HTML innerhalb der ExampleModel-Vorlage wird gerendert (sogar nur für eine Hello World-Vorlage). Ihre letzten beiden Beispiele funktionieren nicht - Sie können keine Logik innerhalb dieses Lambda-Ausdrucks ausführen, sondern nur eine Eigenschaft angeben. Ausnahmedetails: System.InvalidOperationException: Vorlagen können nur mit Feldzugriff, Eigenschaftenzugriff, eindimensionalem Arrayindex oder benutzerdefinierten Indexerausdrücken für einzelne Parameter verwendet werden. – Jaxidian

+0

rufen Sie ein DisplayTemplate aus einem anderen an? – hunter

+0

BTW, ich '' DisplayFor (m => Model ?? neu ExampleModel(), "ExampleModel") 'die ganze Zeit ohne Problem ... diese Ausnahme, die Sie sehen, könnte das Problem – hunter

Verwandte Themen