Mvc3 и Jquery Multiselect, отправка значений на сервер не работает?
Я пытаюсь использовать плагин Jquery Multiselect с сайта Beautiful и MVC3 вместе для отправки значений на сервер. Как показано в примере от Дарина, ключ заключается в создании 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;
}
}
Здесь данные от клиента должны быть все равно нулю?
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 ответа
Ну... После изучения DOM и плагина Jquery выясняется, что плагин дает элементу выбора, имени атрибута, текущему идентификатору, чтобы они были одинаковыми, и форму, ну.. посмотрите на имя attr. Таким образом, решение будет:
$("#Cities").multiSelect();
Ура!
У меня была та же проблема, хотя ваше решение все еще работает. Есть другой способ сделать это с меньшими усилиями.
На самом деле defaultModelbinder связывается с несколькими выбранными значениями, если вы можете изменить свой входной параметр на List<inputparameter>
и изменить линию @Html.DropDownListFor
в @Html.ListBoxFor.
Основное различие между этими двумя элементами управления заключается в том, что первый из них представляет собой один блок выбора, а второй - множественный.
Надеюсь, что это помогает кому-то, имеющему ту же проблему.