2010-12-12 2 views
0

est ici le code écrit à écrire dans un contrôleur:Où devrais-je mettre ce code?

CategoryRepository categoryRepo = new CategoryRepository(); 
var categories = categoryRepo.FindAllCategories(); 
ViewBag.Categories = categories; 

Maintenant, je voudrais utiliser cette option pour créer une belle liste de catégories dynamiquement.

<div id="leftnavigationbar">     
    <ul> 
     @foreach (var category in ViewBag.Categories) 
     { 
      //Create li here.  
     } 

     <!-- ActionLink goes: Text, ActionName, Controller --> 
     <li>@Html.ActionLink("Libros", "Index", "Home")</li> 
     <li>@Html.ActionLink("Peliculas, Musica & Juegos", "Index", "Anuncios")</li> 
     <li>@Html.ActionLink("Computadoras", "Index", "Usuarios")</li> 
     <li>@Html.ActionLink("Bienes Raices", "Index", "Ayuda")</li> 
     <li>@Html.ActionLink("Bolsa de Trabajo", "Index", "Contacto")</li> 
     <li>@Html.ActionLink("Deportes y Fitness", "Index", "Contacto")</li> 
     <li>@Html.ActionLink("Electronicos y Celulares", "Index", "Contacto")</li> 
    </ul>    
</div> 

En ce moment j'écris ce code dans le fichier _Layout.cshtml. Mais j'aimerais savoir où écrire ceci afin qu'il fonctionne toujours, un peu comme une MasterPage.

Des suggestions?

Edit:

Il semble que mon intention initiale est impossible.

@foreach (var category in ViewBag.Categories) 
{ 
    <li>@Html.ActionLink(category.Name, "Index", "Home")</li> 
} 

Des suggestions sur comment accomplir ce que je suis en train de faire? Il suffit de tirer une liste de catégories et de les rendre en utilisant une boucle foreach. Ensuite, placez-le quelque part afin qu'il soit visible sur toutes les pages.

Répondre

0

Vous recherchez quelque chose appelé «vue partielle».

1

Comme toujours vous commencez par créer un modèle de vue:

public class CategoryViewModel 
{ 
    public string CategoryName { get; set; } 
} 

Ensuite, dans votre contrôleur que vous remplissez le modèle de vue:

public ActionResult Index() 
{ 
    var categories = categoryRepo.FindAllCategories(); 
    var model = MapModelToViewModel(categories); 
    return View(model); 
} 

Et enfin votre point de vue fortement typé pourrait utiliser un modèle d'affichage. Il est évident que la vue sera fortement typé à IEnumerable

<ul> 
    @Html.EditorForModel() 

    <!-- ActionLink goes: Text, ActionName, Controller --> 
    <li>@Html.ActionLink("Libros", "Index", "Home")</li> 
    ... 
</ul>    

Et votre modèle d'affichage (~/Vues/Accueil/DisplayTemplates/CategoryViewModel.cshtml):

@model YourApp.Models.CategoryViewModel 
<li>@Model.CategoryName</li> 

Comme vous pouvez le voir avec des vues fortement typées et afficher des modèles que vous n'avez même pas besoin d'écrire des boucles dans vos vues.

En alternative aux modèles d'affichage, vous pouvez utiliser les helper Html.Action ou Html.RenderAction. Phil Haack a écrit un nice blog post à leur sujet. Je suppose que vous avez été forcé d'utiliser le ViewBag non typé laid parce que ce code est situé dans votre modèle maître et vous n'avez pas de modèle de vue. Pas de problème, avec Html.Action vous pourriez avoir un contrôleur spécifique qui le fera:

public class CategoriesController: Controller 
{ 
    public ActionResult Index() 
    { 
     var categories = categoryRepo.FindAllCategories(); 
     var model = MapModelToViewModel(categories); 
     return View(model); 
    } 
} 

Et alors une vue partielle correspondant qui se chargera de rendre les catégories (~/Views/Categories/Index.cshtml):

@model IEnumerable<YourApp.Models.CategoryViewModel> 
@Html.DisplayForModel() 

Et enfin utiliser le même modèle d'affichage.

maintenant dans votre page maître vous pouvez simplement inclure cette action enfant:

<ul> 
    @Html.Action("index", "categories") 

    <!-- ActionLink goes: Text, ActionName, Controller --> 
    <li>@Html.ActionLink("Libros", "Index", "Home")</li> 
    ... 
</ul>