2009-10-21 8 views
1

sélectionnée I ont une vue qui ressemble un peu similaire à ceASP.NET MVC - DropDownLists Chargement en fonction de la valeur

<% using (Html.BeginForm()) {%> 
    <%= Html.DropDownList("Category") %> 
    <%= Html.DropDownList("SubCategory") %> 
    <input type="submit" value="Print" /> 
    <%= Html.ActionLink("Cancel", "Index") %> 
<% } %> 

Je me demandais si quelqu'un savait comment je pouvais charger la sous-catégorie en fonction de la catégorie sélectionnée? Dans les formulaires Web, j'utiliserais simplement l'événement autopostback pour le faire, mais je suis un peu confus sur la façon de le faire en utilisant le framework mvc.

Merci à l'avance

Répondre

2

Transformez votre vue comme ceci:

<% using (Html.BeginForm()) {%> 
    <%= Html.DropDownList("Category", Model.SelectList, new {onchange = "actualize(this);"}) %> 
    <div id="selectdiv"> 
    <% Html.RenderPartial("SubCategories"); %> 
    </div> 
    <input type="submit" value="Print" /> 
    <%= Html.ActionLink("Cancel", "Index") %> 
<% } %> 

<script type="text/javascript"> 

function actualize(obj) 
{ 
    $.ajax({ 
     url: url, 
     async: true, 
     type: 'POST', 
     data: { id: obj.value }, 
     dataType: 'text', 
     success: function(data) { $("#selectdiv").html(data); }, 
     error: function() { 
      console.log('Erreur'); 
     } 
    }); 
} 

</script> 

créer un contrôle appelé SubCategories.aspx et y inclure:

<%= Html.DropDownList("SubCategory",Model.SelectList) %> 

créer une classe de modèle

public class MyModel 
{ 
    public SelectList SelectList {get;set;} 
} 

créer un contrôleur action

public ActionResult SubCategories(int id) 
{ 
    MyModel model = new MyModel(); 
    model.SelectList = new SelectList(YourRepository.GetSubCategories(id),"Id","Name"); 
    return View(model); 
} 
+0

Préférez voir la liste déroulante dans une vue partielle afin qu'elle puisse être réutilisée. Ainsi, au lieu d'avoir les deux listes déroulantes, vous pouvez avoir une vue partielle unique. rend le coiffage un peu plus facile et vous n'avez qu'à faire les choses une seule fois. Je sais que c'est un peu redondant avec une seule liste déroulante mais dans mon expérience cela devient alors une seconde nature avec de plus grands composants réutilisables – griegs

+0

Si vous lisez, la deuxième liste déroulante est dans une vue partielle appelée SubCategories.aspx :) – Gregoire

+0

S'il y avait une autre baisse après les sous-catégories qui dépendaient à la fois des catégories et des sous-catégories, recommanderiez-vous de placer cela dans une autre vue partielle? – AlteredConcept

1

Placez la liste déroulante dans un PartialView. Ensuite, lorsque vous postez revenir faire un retour PartialView ("viewName", modèle). Ensuite, dans le retour de votre jQuery, remplacez simplement la vue partielle par le nouveau html qui est retourné.

Alors vous êtes vu;

<div id="myPartialView"> 
    <% Html.PartialView("PartialViewName", model); %> 
</div> 

Ensuite, votre jQuery fait quelque chose comme

$('#myPartialView').html = retHtml; 

Votre C#

return PartialView("PartialViewName", model); 

Untested mais c'est l'approche que je pense que vous voulez prendre.

Questions connexes