【问题标题】:Mvc3 and Jquery Multiselect, sending values to server not working?Mvc3和Jquery Multiselect,向服务器发送值不起作用?
【发布时间】:2012-03-13 13:25:04
【问题描述】:

我正在尝试使用来自Beautiful site 和 MVC3 的 Jquery Multiselect 插件一起将值发送到服务器。如 Darin 的 example 所示,关键是创建 MultiSelectModelBinder 类,我猜该类将识别从客户端发送的值,因为多选插件使用 [] 表示法将选定的值发送到服务器。我的方法有点不同,我从控制器而不是模型填充 dropDownList,保持模型干净,并且还能够从数据库中填充列表。我使用 Darins 示例创建 MultiSelectModelBinder 并将其注册到 Application_Start() 的模型绑定器中。我的问题是我总是将空模型返回到我的控制器,这是代码:

型号:

public class PersonsSearchModel
{
    public string Person { get; set; }
    public string Company { get; set; }

    //here is my Cities collection
    public IEnumerable<string> Cities { get; set; }
} 

查看:

@model MyNamespace.Model.PersonsSearchModel
@using (Ajax.BeginForm("Search", "Persons", new AjaxOptions
{
    HttpMethod = "GET",
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "results",
    LoadingElementId = "progress"
},
    new { @id = "searchFormPerson" }
))
{    
  <span>
      @Html.TextBoxFor(x => Model.Person, new { @class = "halfWidth"})
  </span> 
  <span>
      @Html.TextBoxFor(x => Model.Company, new { @class = "halfWidth"})
  </span> 
  <span>
      @Html.ListBoxFor(x => x.Cities, Model.Items, new { @id="combobox1"})
  </span>
  <input name="Search" type="submit" class="searchSubmit" value="submit" />
}

控制器:

public ActionResult Index()
{

    var listCities = new List<SelectListItem>();
    listCities.Add(new SelectListItem() { Text = "Select one...", Value = "" });
    listCities.Add(new SelectListItem() { Text = "New York", Value = "New York" });
    listCities.Add(new SelectListItem() { Text = "Boston", Value = "Boston" });
    listCities.Add(new SelectListItem() { Text = "Miami", Value = "Miami" });
    listCities.Add(new SelectListItem() { Text = "London", Value = "London" });

    ViewBag.Cities = listCities;

    return View();

}

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

    }
}

这里客户端的数据应该到达了,butt 总是为空?

public PartialViewResult Search(PersonsSearchModel psm)
{
     var person = psm.Person;
     var company = psm.Company;
     var city =  psm.Cities.ElementAt(0);

     return GetResultPartialView(city);

}

GLOBAL.asax.cs

 protected void Application_Start()
 {
     //...
    //model binder

     ModelBinders.Binders.Add(typeof(IEnumerable<string>), new
     FinessenceWeb.Controllers.PersonsController.MultiSelectModelBinder());
 }

JQUERY

$("#combobox1").multiSelect();

【问题讨论】:

    标签: c# jquery asp.net-mvc-3 drop-down-menu multi-select


    【解决方案1】:

    我遇到了同样的问题,尽管您提供的解决方案仍然有效。还有另一种更省力的方法。

    如果您可以将输入参数更改为List&lt;inputparameter&gt; 并将@Html.DropDownListFor 行更改为@Html.ListBoxFor.,则实际上defaultModelbinder 确实绑定到多个选定值

    这两个控件之间的主要区别是,第一个是单选框,第二个是多选框。

    希望这对遇到同样问题的人有所帮助。

    【讨论】:

      【解决方案2】:

      嗯...在查看 DOM 和 Jquery 插件后,发现插件提供了 select 元素、属性名称、当前 id,所以它们是相同的,而且形式,嗯.. 看看名称 attr。所以解决方案是:

      $("#Cities").multiSelect();
      

      干杯!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-07
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        • 2016-07-31
        • 1970-01-01
        • 2012-07-11
        • 1970-01-01
        相关资源
        最近更新 更多