2009-02-05 7 views
3

Si vous allez générer une page sous forme de chaîne et sortir tout le contenu via Response.Write à la dernière minute où devriez-vous mettre ce code?ASP.NET MVC - Code Response.Write - le placer dans le Controller, SingleFile ou CodeBehind

Je dois être en mesure d'écrire dynamiquement un tas de JavaScript pour le client afin d'utiliser une partie de la nouvelle version de jsapi de visualisation de Google. J'ai remarqué que cette dernière version de la structure MVC "décourage" CodeBehinds sur les vues. C'est vraiment du code de présentation. Où devrait-il aller? Quelle est la méthode préférée ici ... Je n'ai jamais été un fan de la chose "SingleFile".

Répondre

4

Le code est-il paramétrable? Est-ce que vous pouvez contrôler les différences entre une invocation et une autre via un petit ensemble de paramètres? Si c'est le cas, je considérerais écrire une extension HtmlHelper pour le générer. Ensuite, j'utiliserais l'extension dans ma vue pour générer le code. Passez les paramètres à View via ViewData du contrôleur si vous ne pouvez pas le dériver à partir des valeurs Model ou RouteValues.

<%= Html.GenerateGoogleVisAPI(ViewData["someThing"], 
           ViewData["otherThing"]) %> 

Une autre alternative serait de faire un ViewUserControl - auquel vous pouvez passer d'un modèle et ViewData. Vous incluriez toujours ceci via la vue.

<% Html.RenderPartial("GoogleVisControl", 
         ViewData["GoogleVisModel"], 
         ViewData); %> 

EDIT:

Mes HtmlHelperExtensions vont habituellement dans un projet de bibliothèque de classes séparées. Donc, ma hiérarchie ressemblerait à quelque chose comme ceci. Notez que j'omets les projets de test associés à chaque niveau pour des raisons de concision, mais ils seraient également inclus. Si vous avez plusieurs applications utilisant la même couche de données, la couche de données peut exister dans une solution distincte, selon que vous avez une solution par application ou plusieurs applications par solution. J'ajoute des références de projet au projet web pour les projets de bibliothèque de classes.

 
+-Project.Web 
+-Content 
+-Controllers 
+-Models 
+-Views 
    +-... 
    +-Shared 
    +-Error.aspx 
    +-GoogleVisControl.ascx 
    +-LoginUserControl.ascx 
    +-Site.Master 
    +-... 
    +-... 
+-... 
+-Project.Common 
+-Project.Common.Web 
+-HtmlHelperExtensions.cs 
+-... 
+-Project.Data 
+... 
+0

Puisque Javascript est une composante de la vue, j'utiliserais l'approche d'assistance que tvanfosson suggère. –

+0

Première réflexion, où placez-vous le code pour l'extension HtmlHelper. Pouvez-vous modifier votre réponse pour inclure où ils vont dans la hiérarchie du projet. Et je suppose que je dirais "non" le truc n'est pas paramétrable. Tout est basé sur des charges de données provenant d'un DataTable ADO.NET. – BuddyJoe

+0

Deuxièmement, si je fais un ceci dans un UserControl (.ascx) devrais-je utiliser un CodeBehind? Je remarque qu'il "m'encourage" à utiliser un design SingleFile .... mais pas même parce qu'il ne met même pas dans le talon Page_Load – BuddyJoe

8

Vous pouvez également utiliser le type ActionResultContent pour retourner une chaîne de caractères au navigateur.

public ActionResult myAction() { 
    Return Content("Hello World!"); 
} 

Cependant, je ne suis pas sûr que ce soit la meilleure approche lors du retour de JavaScript. Vous pourriez envisager d'écrire votre propre JavaScriptResult qui hérite ActionResult.

+0

+1. J'aime ce concept. – BuddyJoe

Questions connexes