2009-11-26 4 views
1

Si je crée une vue partielle pour une boîte contenant un en-tête, une image et du contenu, quelle est la meilleure façon de stocker le contenu sans utiliser de base de données?Données de boîte de contenu réutilisable dans ASP.NET MVC?

Exemple: TurboTax

Je doute que le contenu des boîtes dans la barre latérale sont stockés dans une base de données, mais pour rendre le code réutilisable, il serait utile de créer la structure dans un PartialView et peupler les zones de contenu. Je peux créer une vue partielle et passer un modèle du contrôleur parent à la vue partielle, mais je serais coincé copier et coller ce même contenu si je voulais utiliser la même boîte sur une autre page.

+1

Pourriez-vous donner quelques informations sur les raisons pour lesquelles vous voulez éviter d'utiliser une base de données? C'est probablement la meilleure solution. – tvanfosson

Répondre

1

Pour le contenu fixe, vous voudrez peut-être penser à utiliser XML + XSLT ou même des extraits HTML dans le système de fichiers et simplement les rendre. Une méthode HtmlHelper pourrait avoir plus de sens pour cela qu'une vue partielle - Html.RenderXml() ou Html.Include(). La seule vraie différence entre ces vues et les vues partielles est que le moteur de vue n'est pas appelé puisqu'il n'y a pas de substitutions. Je fais ce genre de chose avec ma politique de confidentialité et les termes et conditions. Je considérerais certainement garder ces cachés. Si ce sont vraiment des modèles et que vous ne faites que substituer du contenu, je pense que la vue partielle fonctionne bien et que je considérerais mettre les données dans une base de données, peut-être en utilisant la mise en cache si je trouvais que les performances souffraient. Vous pouvez utiliser ceci en combinaison avec l'ancien - par exemple garder vos images/xml dans le système de fichiers et un pointeur vers eux dans la base de données afin que vous sachiez lesquels choisir dans le partiel.

1

données Passing à vue partielle qui est utilisé dans de nombreux endroits peuvent se faire de plusieurs façons:

Créer une classe de modèle de base pour tous vos modèles. Dans la classe de base, définissez la propriété PartialModel qui contiendra le modèle pour la vue partielle (il peut y en avoir beaucoup si l'utilisation a plusieurs vues partielles). Vous pouvez maintenant renseigner la propriété PartialModel dans l'action du contrôleur, mais pour rendre le code plus réutilisable, vous pouvez créer votre propre filtre d'action qui insérera les données de vue partielle juste après l'exécution de la méthode action (mais avant que le modèle ne soit transmis à la vue)

public class PartialViewModelAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
    BaseViewModel model; 

    if (filterContext.Controller.ViewData.Model == null) 
    { 
      model = new BaseViewModel(); 
      filterContext.Controller.ViewData.Model = model; 
    } 
    else 
    { 
     model = filterContext.Controller.ViewData.Model as BaseViewModel; 
    } 

    model.PartialModel = new PartialModel(...) // Partial model initialization 
    base.OnActionExecuted(filterContext); 
    } 
} 

Ensuite, vous pouvez l'utiliser comme:

[PartialViewModel] 
public ActionResult Index() 
{ 
    //... 
} 

Une autre option: vous pouvez créer la classe BaseController pour tous vos contrôleurs et créer PartialModel lors de l'initialisation du contrôleur de base. Ensuite, PartialModel peut être stocké dans le dictionnaire ViewData []. Parce que l'utilisation dictionnaire ViewData dans les vues est mauvaise, créer méthode d'extension sur HtmlHelper comme:

public static PartialModel GetPartialModel(this HtmlHelper helper) 
{ 
    return helper.viewContext.ViewData["PartialModel"] as PartialModel 
} 

vous pouvez donc obtaint le modèle de cette façon:

<% Html.RenderPartial("MyPartial", Html.GetPartialModel()); %> 
Questions connexes