2011-04-14 3 views
0

J'ai une liste déroulante qui doit appeler une action sur un contrôleur avec la valeur de paramètre de la valeur dropdownlist sélectionnée sur son événement OnChange.ASP.NET MVC2 Dropdownlist et URL.action

C'est ce que j'ai en ce moment.

<%= Html.DropDownList("series",              
      new SelectList((IEnumerable)ViewData["series"], "ProductId", "SeriesName"), 
         new { onchange = "??" })%> 

Je peux joindre la liste dans un élément de forme

<form id="SeriesForm" action="<%: Url.Action("S", "ProductSearch", new {SeriesId = ?? }) %>" method="post"> 

Mais comment puis-je régler le paramètre SeriesId qui devrait être la valeur sélectionnée dans le menu déroulant? J'ai essayé d'attacher une méthode jQuery à l'événement OnChange mais je ne suis pas en mesure de modifier la méthode Url.Action.

Merci,

Répondre

1

Une façon très simple est d'utiliser l'URL que vous voulez appeler la valeur des options dans le menu déroulant. Il existe d'autres façons de le faire, mais c'est le plus bare-bones:

<select id="myList" ...> 
<% foreach (var id in ids) { %> 
    <option value="<%= Url.Action("Action", "Controller", new { id = id }) %>">id</option> 
<% } %> 
</select> 

Et puis de jQuery, juste obtenir l'URL comme ceci:

$('#myList').change(function(){ 
    $.get($(this).val(), doOnSuccess); 
}); 

Autres façons de le faire:

  1. envelopper le menu déroulant sous une forme et ajouter un formulaire via jQuery lorsqu'un nouvel élément est sélectionné (le contrôleur serait juste recevoir la valeur de la chute vers le bas en tant que paramètre de requête HTTP)
  2. créer dynamiquement une demande chaque fois que la liste déroulante est modifiée. Ainsi, au lieu de demander $(this).val() vous demander une URL que vous avez stockées quelque part et passer $(this).val() comme la partie de données: $.get($('#storeMyUrl').val(), $(this).val(), doOnSuccess)

EDIT: est ici une explication plus détaillée de la première variante (fait en rasoir pour la facilité, et html explicite pour la clarté (heureusement)):

<form id="theForm" action="@Url.Action("A", "C")" method="POST"> 
    @Html.DropDownList("paramName", theSelectListAsInTheQuestion, new { id = "theDropDown" }) 
</form> 

... 

public class CController : Controller { 
    [HttpPost] 
    public ActionResult A (int paramName) { 
     ... 
    } 
} 

... 

// and in jQuery 
$('#theDropDown').change(function(event){ 
    var f = $('#theForm'); 
    $.post(f.attr('action'), f.serialize(), onSuccess); 
}); 
+0

Milimétrique, merci pour vos commentaires. Pouvez-vous élaborer plus avant sur la première alternative que vous mentionnez dans vos autres façons de le faire (c'est-à-dire, envelopper dans un formulaire et en saisissant la valeur de la liste déroulante en utilisant le paramètre de requête HTTP)? – fjxx

+0

Merci pour l'explication détaillée Milimétrique - mais je l'ai essayé mais cela ne fonctionne pas. – fjxx

+0

Que voulez-vous dire par "ça ne marche pas"? Je ne faisais que coder à main levée, peut-être que j'ai fait une erreur stupide, mais l'approche ci-dessus est définitivement correcte. – Milimetric