2011-10-19 3 views

Répondre

6

Le plugin utilise multiselect la notation [] pour envoyer les valeurs sélectionnées au serveur. Comme toujours, nous commençons par écrire un modèle de vue:

public class MyViewModel 
{ 
    public IEnumerable<string> SelectedValues { get; set; } 

    public IEnumerable<SelectListItem> Items 
    { 
     get 
     { 
      return new[] 
      { 
       new SelectListItem { Value = "1", Text = "item 1" }, 
       new SelectListItem { Value = "2", Text = "item 2" }, 
       new SelectListItem { Value = "3", Text = "item 3" }, 
      }; 
     } 
    } 
} 

puis un contrôleur:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

une vue correspondante:

@model MyViewModel 

<script src="@Url.Content("~/Scripts/jquery.multiSelect.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
    $(function() { 
     $("#SelectedValues").multiSelect(); 
    }); 
</script> 

@using (Html.BeginForm()) 
{ 
    @Html.ListBoxFor(x => x.SelectedValues, Model.Items) 
    <button type="submit">OK</button> 
} 

et enfin un modèle de liaison associé au type IEnumerable<string> et qui fonctionnera avec la notation [] utilisée par le plugin:

public class MultiSelectModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var model = (MyViewModel)base.BindModel(controllerContext, bindingContext); 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName + "[]"); 
     if (value != null) 
     { 
      return value.RawValue; 
     } 
     return model; 
    } 
} 

La dernière partie est d'enregistrer le liant modèle Application_Start:

ModelBinders.Binders.Add(typeof(IEnumerable<string>), new MultiSelectModelBinder()); 
+0

FANTASTIQUE! Merci! – JaJ

2

S'il vous plaît essayer ceci pour obtenir les valeurs sélectionnées

public ActionResult Index(MyViewModel model, FormCollection collection) 
    { 
     string selectedValues=collection["SelectedValues[]"]; //here you get comma separated values 
     return View(model); 
    } 
+0

C'était un petit raccourci génial au lieu de itérateur à travers le modèle []. Merci! – JaJ

0

En fait, vous pouvez également recevoir les valeurs sélectionnées en ajoutant un paramètre à votre action.

Par exemple, disons que vous avez ci-dessous listbox:

//Controller GET 
public ActionResult ManageUsers() 
{ 
    ViewBag.Users = new SelectList(repository.GetAllUsers(), "Id", "Email"); 
    return View(); 
} 

//View 
@Html.ListBox(ViewBag.Users as SelectList, new { @id = "users" }) 

//Controller POST 
[HttpPost] 
public ActionResult ManageUsers(List<int> users) 
{ 
    //Manage all the selected users which will appear in the List. 

    return View()... 
} 

Je crois que vous pouvez avoir un tableau que le type au lieu d'une liste générique aswell, havn't essayé moi-même si, la clé est toutefois nommez le paramètre de la même manière que l'ID d'élément html pour la zone de liste.

Questions connexes