2010-12-08 12 views
1

Nous faisons de notre mieux pour ne pas utiliser RenderPartial mais plutôt utiliser EditorFor et DisplayFor dans 100% des cas. Cependant, il y a un scénario que nous n'avons pas réussi à faire fonctionner jusqu'à présent: Lorsque la vue partielle a besoin de l'ensemble de ViewModel, ou en d'autres termes, quand il doit être Html.DisplayFor(m => m, "MyTemplateThatNeedsTheEntireViewModel"). Il fonctionne très bien si elle est Html.DisplayFor(m => m.Prop, "MyTemplateThatOnlyNeedsTheOneProperty") mais nous ne pouvons pas passer tout le ViewModel dans.Passer un ViewModel entier dans un DisplayTemplate?

Y at-il un moyen d'atteindre ce qui fonctionnera aussi bien avec DisplayFor et EditorFor?

Ce que je vois maintenant est que rien (ou peut-être des espaces) n'est rendu à mon balisage. Cependant, le compilateur et ReSharper semblent penser que ma syntaxe est parfaite. Changer mon code pour appeler RenderPartial fonctionne parfaitement, mais c'est ce que j'essaie d'éviter.

J'essaye ces trois lignes. Le RenderPartial fonctionne parfaitement, les EditorFors ne fonctionnent pas (balisage final est une chaîne vide ou des espaces):

<% 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

quel est le type de chacun des DisplayTemplates? – hunter

+0

Ils sont très personnalisés ViewModels. Par exemple, nous avons un 'BusinessDetailsViewModel' où nous passons à un' BusinessSummary' (information toujours à l'écran) et 'BusinessDetails' (contenu de l'un des nombreux onglets), puis différentes propriétés de' BusienssDetailsViewModel' sont passées dans des modèles d'affichage/éditeur dans des onglets supplémentaires. – Jaxidian

Répondre

1

Si votre DisplayTemplate est:

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

DisplayFor(m => m, "ExampleModel") 

devrait fonctionner

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

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

devrait travail

Un problème que vous pourriez être que quelque chose est nul, auquel cas il ne devrait probablement pas être frapper la vue du tout, mais vous pouvez contourner ce problème en écrivant:

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

ou

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

Votre tout premier exemple est exactement ce que j'essaie de faire et aucun HTML à l'intérieur du modèle ExampleModel rend (même pour un type de modèle Hello World). Vos deux derniers exemples ne fonctionnent pas - vous ne pouvez pas exécuter de logique à l'intérieur de cette expression lambda, mais seulement spécifier une propriété. 'Détails d'exception: System.InvalidOperationException: Les modèles peuvent être utilisés uniquement avec l'accès au champ, l'accès aux propriétés, l'index de tableau à dimension unique ou les expressions d'indexeur personnalisé à paramètre unique. – Jaxidian

+0

appelez-vous un DisplayTemplate d'un autre? – hunter

+0

BTW, je fais 'DisplayFor (m => Model ?? new ExampleModel()," ExampleModel ")' tout le temps sans problème ... cette exception que vous voyez pourrait être le problème – hunter