2011-02-16 4 views
4

J'ai une vue partielle que je veux être générique. Selon this question, les vues partielles ne peuvent pas être génériques. J'ai donc fait une extension HtmlHelper qui gère les pièces pour lesquelles je veux une sécurité de type, puis passe le reste à une vraie vue partielle.ASP.NET MVC Générique Vue partielle Motif

Habituellement, mon assistant est appelé sur le chargement de la page, ce qui fonctionne bien, mais parfois je veux ajouter une ligne ou quelque chose via AJAX. Lorsque cela se produit, le contrôleur ne peut pas utiliser ma "vue partielle" car il n'a pas accès au HtmlHelper.

En plus d'avoir une vue partielle avec un modèle de type object, y at-il quelque chose que je peux faire? J'utilise Razor, si cela est important.

Une version simplifiée de ce que je fais:

public static MvcHtmlString DoStuff<T>(this HtmlHelper html, IEnumerable<T> data, 
    Func<T, ViewModelType> StronglyTypedFn, string PartialName) 
    { 
    // the pre- and post-processing for the partial view is complex enough I'd like 
    // to encapsulate it. But I want the encapsulation to include the safety 
    // benefits that generics give. 
    var mappedData = data.Select(StronglyTypedFn); 
    string htmlData = ""; 
    foreach(var model in mappedData){ 
    htmlData += html.Partial(PartialName, model); 
    } 
    htmlData += "some boilerplate footer html"; 
    return htmlData; 
} 

je me rends compte que, dans cet exemple, j'ai si peu de lignes de code en dehors de la vue partielle qu'il semble inutile d'avoir une aide, mais dans mon véritable exemple, c'est plus complexe.

Maintenant, dans un appel ajax je veux retourner Html.DoStuff(). Mais je ne peux pas, car cela nécessite un accès à la HtmlHelper, et l'aide n'est pas disponible dans un contrôleur.

+0

Je ne comprends pas parfaitement votre scénario. Pourriez-vous montrer à quoi ressemble cette aide et comment vous l'appelez de votre point de vue? –

+0

@Darin: J'ai ajouté un exemple. Il pourrait y avoir une meilleure façon d'accomplir cela sans rapport avec la façon dont je l'ai fait. – Xodarap

+0

Alors, quel est le problème exact? Votre code semble bien. Vous faites allusion à "le contrôleur ne peut pas utiliser ma" vue partielle "car il n'a pas accès au HtmlHelper" mais on ne sait pas ce que vous essayez de faire dans le cas AJAX. – marcind

Répondre

0

Vous pouvez tout simplement avoir une méthode d'action simple qui appelle la partie d'une instance de modèle

public PartialViewResult Single(string partialName) { 
    return PartialView(partialName); 
} 
+0

Merci pour la réponse, mais le problème est que je veux retourner le résultat de l'ensemble de l'aide. Donc, pour mon exemple, je voudrais retourner 'Html.DoStuff()'. (À moins que je ne comprenne complètement votre suggestion ...?) – Xodarap

+0

Je pourrais mal comprendre votre question.Peut-être pourriez-vous ajouter à votre question un échantillon du type de sortie que vous voulez pour le chargement de la première page par rapport à ce que vous voulez de la requête ajax. – marcind

+0

Je pense que ma question n'était pas claire. Je veux exactement la même chose sur le chargement de la page par rapport à ajax. Je vais éditer la question. – Xodarap

0

Vous pouvez utiliser une vue avec un type dynamique au lieu d'objet. Mais ... Il semble qu'il y ait un malentendu ici parce que le contrôleur ne devrait pas essayer de rendre la vue du tout. Pourriez-vous poster le code du contrôleur?

La meilleure option est, IMO, retourner un JsonResult pour votre requête ajax et ajouter la ligne/lignes sur le côté client en utilisant JS.

Questions connexes