1 votes

Où et comment charger les listes déroulantes utilisées dans la page principale ?

Je suis nouveau à MVC !

J'essaie d'utiliser deux listes déroulantes (Villes, Catégories) dans une PartialView qui sera utilisée dans la MasterPage, ce qui signifie qu'elles seront visibles en permanence.

J'ai essayé de les charger dans HomeCOntroller, mais cela n'a pas fonctionné. J'ai obtenu une exception.

J'ai lu quelque chose sur la création d'un baseController dont les autres contrôleurs hériteront, j'ai essayé, en quelque sorte, mais je pense que je fais quelque chose de mal.

C'est le seul code que j'ai reçu aujourd'hui :

Page principale

<% Html.RenderPartial("SearchForm"); %>

Vue partielle (SearchForm.ascx)

<% using (Html.BeginForm("Search", "Search")) { %>
<% } %> // dont know why I need two BeginForms, if I dont have this the other form won't trigger at all! Weird!

<% using (Html.BeginForm("Search", "Search", FormMethod.Get)) { %>

    <%= Html.DropDownList("SearchForm.Category",  new SelectList(ViewData["Categories"] as IEnumerable, "ID", "Name", "--All categories--")) %>

    <%= Html.DropDownList("Search.City", Model.Cities, "--All cities--") %>
    <input name="search" type="text" size="16" id="search" />
    <input type="submit" id="test" title="Search" />
    <% } %>

Deux questions :

  1. Le problème est de savoir où et comment charger les listes déroulantes. J'ai essayé de les charger dans le HomeController, mais lorsque je vais sur une autre page, le système me dit que les DDL sont vides et j'obtiens une Excecption.
  2. Pourquoi dois-je utiliser deux formulaires pour que l'ActionMethod se déclenche ?

J'espère que quelqu'un pourra m'aider !

2voto

Christos Hayward Points 1142

Il semble que vous ne définissiez la propriété que pour un seul résultat d'action. Les données de Model.Cities devront être renseignées pour chaque vue qui devra les utiliser.

Une solution consisterait à déplacer la population vers un filtre d'action (ActionFilter).

public class CityListAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        var result = filterContext.Result as ViewResult;
        result.ViewData.Model = //populate model
        base.OnActionExecuted(filterContext);
    }
}

puis ajoutez le filtre à votre contrôleur

[CityList]
public class HomeController : Controller {  
    public ActionResult Index() {
        return View();
    }
}

En ce qui concerne la question des deux formulaires, il n'y a aucune raison, à ma connaissance, pour que vous ayez besoin d'un formulaire vide.

Jetez un coup d'œil au code html qui est affiché et assurez-vous qu'il est correct. Vérifiez également que l'action est générée correctement.

1voto

Necros Points 2226

La meilleure façon de procéder est de créer quelque chose comme MasterController et d'y appliquer une méthode d'action comme suit :

[ChildActionOnly]
public ActionResult SearchForm()
{
    //Get city data, category data etc., create SearchFormModel
    return PartialView(model);
}

Je vous recommande de créer une vue fortement typée (SearchForms.ascx de type ViewUserControl<SearchFormModel> ). Il peut également être utile de disposer d'un modèle de ce type :

public class SearchViewModel
{
    public IList<SelectListItem> Cities { get; set; }
    public IList<SelectListItem> Categories { get; set; }
}

et utiliser une aide comme celle-ci : http://github.com/Necroskillz/NecroNetToolkit/blob/master/Source/NecroNet.Toolkit/Mvc/SelectHelper.cs pour convertir au préalable les données brutes dans un format compatible avec le DDL.

Dans tous les cas, vous utilisez maintenant Html.RenderAction() au lieu de Html.RenderPartial() et précisez que vous souhaitez que l'action "SearchForm" soit exécutée par le "MasterController".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X