2011-10-19 6 views

答えて

6

複数選択プラグインは、サーバに選択された値を送信する[]表記法を使用します。その後、コントローラを

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" }, 
      }; 
     } 
    } 
} 

:いつものように私たちはビューモデルを書き込むことによって開始

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

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

対応するビュー:

@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> 
} 

IEnumerable<string>タイプに関連付けられている最後にモデルバインダーとプラグインで使用されている[]という表記で動作します。

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; 
    } 
} 

最後の部分はApplication_Startでモデルバインダーを登録することである。

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

ファンタスティック!ありがとう! – JaJ

2

値は

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

これは、[]モデルを使ったイテレータではなく、ちょっとしたショートカットです。ありがとう! – JaJ

0

実際に、あなたはまた、パラメータを追加することによって、選択された値を受け取ることができ、選択を取得するために、これを試してみてくださいあなたの行動にやりなさい自身はしかし、キーはしかしにある、それを試してみました、私はあなたの代わりに、一般的なリストのaswellの種類として配列を持つことができると信じて

//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()... 
} 

:例えば

は、あなたがリストボックス以下していると言うことができますパラメータには、リストボックスのhtml要素IDと同じ名前を付けます。

関連する問題