Mvc3 и Jquery Multiselect, отправка значений на сервер не работает? - PullRequest
0 голосов
/ 13 марта 2012

Я пытаюсь использовать плагин Jquery Multiselect из Красивый сайт и MVC3 вместе для отправки значений на сервер. Как показано в примере от Дарина, ключом является создание класса MultiSelectModelBinder, который, я думаю, распознает значения, отправленные с клиента, потому что плагин множественного выбора использует нотацию [] для отправки выбранных значений на сервер. , Мой подход немного отличается, я заполняю dropDownList от моего контроллера, а не от модели, сохраняя модель в чистоте, а также смог заполнить список из базы данных. Я использовал пример Даринса, чтобы создать 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" />
}

CONTROLLER:

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;

    }
}

Здесь данные от клиента должны быть получены, приклад всегда равен нулю?

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();

Ответы [ 2 ]

1 голос
/ 29 ноября 2013

У меня была та же проблема, хотя ваше решение все еще работает.Есть другой способ сделать это с меньшими усилиями.

На самом деле defaultModelbinder связывается с несколькими выбранными значениями, если вы можете изменить свой входной параметр на List<inputparameter> и изменить строку @Html.DropDownListFor на @Html.ListBoxFor.

Разница между этими двумя элементами управленияПервый из них представляет собой одно поле выбора, а второй - множественный селектор.

Надеюсь, это поможет кому-то, имеющему ту же проблему.

0 голосов
/ 13 марта 2012

Ну ... После изучения DOM и плагина Jquery выясняется, что плагин дает элементу выбора, имени атрибута, текущему идентификатору, чтобы они были одинаковыми, и форму, ну .. посмотрите на имя attr. Таким образом, решение будет:

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

Ура! * * 1004

...