2009-03-11 6 views
5

Je suis un peu confus avec essayer d'apporter une liste de catégories dans une barre de navigation sur un MasterPageView dans la dernière version de l'infrastructure ASP.NET MVC. J'ai 0 expérience avec Partials jusqu'ici (ceci ajoute à la confusion).ASP.NET MVC - MasterPageView et RenderPartials - Confusion

Devrais-je utiliser cette variante du RenderPartial?

HtmlHelper.RenderPartial(string partialViewName, object model) 

Je n'ai pas réussi à trouver de bons exemples de cette méthode. Par convention, il n'y a pas de modèle associé au droit MasterPageView? Alors, quelle est la bonne façon de pousser ou de tirer des données dans un "partiel" de la MasterPageView?

En supposant que cette méthode est tout à fait sur la mauvaise voie:

<div id="navigation"> 
     <% 
      CategoryRepository cr = new CategoryRepository(); 
      IList<Category> lst = cr.GetCategories(); 
      Html.RenderPartial("NavBar", lst); 
     %> 
    </div> 

Répondre

0

J'utiliser Html.RenderAction() au lieu et retourner une vue partielle de celle-ci.

+0

Où trouvez-vous la méthode RenderAction() à partir? Est-ce une contribution? – BuddyJoe

+0

Il pourrait être dans MVC Futures sur CodePlex. Je ne me souviens pas de la main (pas proche de l'endroit où je peux vérifier maintenant) –

1
public ActionResult NavBar() 
{ 

      CategoryRepository cr = new CategoryRepository(); 
      IList<Category> lst = cr.GetCategories(); 


      return View(lst); 
} 

sur votre appel partiel

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<%@ Import Namespace="app.Models" %> 

et tu feras tout ton rendu ui ici

<div id="navigation"> 
     <% 
      Html.RenderPartial("NavBar"); 
     %> 
    </div> 

vous pouvez le faire ActionResult appels dans vos contrôleurs

+0

Sur chacun de mes contrôleurs, je dois faire cet appel NavBar()? ou en hériter dans ... cela ne semble pas juste. – BuddyJoe

+0

ce que je fais est de créer BaseController qui hérite du contrôleur et de mettre tous mes appels de code partiel réutilisables dans le contrôleur de base et tous mes contrôleurs héritent le BaseController. De cette façon, tous les contrôleurs ont accès à ce partiel. – Ayo

+0

Non, vous ne devez pas. il suffit de mettre votre code de navigation @ fichier masterpage – Funky81

1

Je dirais que depuis sa la page principale, vous devrez probablement stocker vos données que vous transmettez dans ViewData avec comme tring clé. Si c'était une page de vue normale, il serait préférable d'avoir une page fortement typée, mais c'est un cas différent. Donc, vous auriez probablement faire quelque chose dans votre contrôleur:

ViewData["MasterPageData"] = FunctionToGetData(); 

Et puis sur la page maître quelque chose comme ceci:

<% 
    if (ViewData["MasterPageData"] != null) 
    { 
     Html.RenderPartial("ControlName.ascx", ViewData); 
    } 
%> 

Ensuite, dans le contrôle, le processus comme vous le feriez sur une page vue normale:

<% var categories = (CastIfNeeded)ViewData["MasterPageData"]; %> 

process as normal... 

Je n'ai pas eu pour transmettre des données à une page maître encore, mais comment je pense que vous le feriez. En savoir plus here.

EDIT: J'ai modifié le tout pour refléter ce que je fais dans mon projet actuel.

+0

+1 bonne info. Permettez-moi de vous demander ceci dans votre exemple ... vos données de passage dans le modèle [objet]. Comment faites-vous référence à partir du Partial? Le tutoriel montre la méthode ViewData. – BuddyJoe

+0

Modifié pour (j'espère) répondre à votre question. –

7

Voulez-vous que votre page maître ait des données d'affichage? Vous pouvez le résoudre en ayant une vue de base de données de classe que tous vos autres classes vidéotex héritent de ...

BaseViewData.cs - c'est une classe vidéotex que toutes les autres classes vidéotex vont hériter de

public class BaseViewData 
{ 
    public string Title { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    IList<Category> NavCategoryList { get; set; } 
} 

Maintenant dans votre page Site.Master ont simplement

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<BaseViewData>" %> 

<title><%=ViewData.Model.Title %></title> 
<meta name="keywords" content="<%=ViewData.Model.MetaKeywords %>" /> 
<meta name="description" content="<%=ViewData.Model.MetaDescription %>" /> 

<%= Html.RenderPartial("NavBar", ViewData.Model.NavCategoryList) %> 

Cela pourrait avoir un impact significatif sur l'architecture de votre application, mais ce n'est pas nécessairement une mauvaise chose.

HTHS, Charles

+0

Oui, je suis cette méthode. –

+0

+1 Hmmm. Cela pourrait fonctionner ... et au moins maintenant je connais le "ViewData.Model". syntaxe. Je ne sais pas pourquoi je ne l'avais pas encore vu. – BuddyJoe

+0

Le projet Kigg le fait de cette façon, je suis sur le point de l'implémenter. Où et comment chargez-vous le modèle pour que la page maître puisse faire ceci: ViewData.Model.Titl – Picflight