Dar*_*rov 6

multiselect插件使用[]表示法将选定的值发送到服务器.我们一如既往地编写视图模型:

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" },
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后一个控制器:

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

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}
Run Code Online (Sandbox Code Playgroud)

相应的观点:

@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>
}
Run Code Online (Sandbox Code Playgroud)

最后是一个与该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;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后一部分是注册模型绑定器Application_Start:

ModelBinders.Binders.Add(typeof(IEnumerable<string>), new MultiSelectModelBinder());
Run Code Online (Sandbox Code Playgroud)