Сериализованное значение select2 недоступно в контроллере asp.net mvc - PullRequest
1 голос
/ 04 октября 2019

У меня есть представление, в котором есть несколько элементов управления внутри div, которые я хочу сериализовать и передать в контроллер через AJAX. Поле SchoolType в представлении представляет собой выпадающий список выбора select2.

Модель:

public class SchoolModel
{
     public string StudentName{ get; set; }
     public List<string> SchoolType{ get; set; }
     public List<SelectListItem> SchoolTypeList{ get; set; }
}

Вид:

<div id="divSchool">
    <div class="row">
        <div class="col-md-12">
            <div class="col-md-6">
                <div class="form-group">
                    <label asp-for="SchoolType" class="col-md-3 control-label">School Type</label>
                    <div class="col-md-9">
                        <select asp-for="SchoolType" asp-items="Model.SchoolTypeList" class="form-control medium"></select>
                    </div>
                </div>
            </div>
            <div class="col-md-6">
                <div class="form-group">
                    <label asp-for="StudentName" class="col-md-3 control-label">Student Name</label>
                    <div class="col-md-9">
                        <input asp-for="StudentName" class="form-control" />
                    </div>
                </div>
            </div>
        </div>
    </div>       
</div>

Контроллер:

[HttpPost]
public ActionResult Index(SchoolModel model)
{
}

Мой код JS:

$('#SchoolType').select2({
    placeholder: "Filter by school"
}

$("document").on("click", ".btnCheck", function () {
var model = $('#divSchool').find('select, textarea,input').serialize();

$.ajax({
        url: "/Student/Index",
        type: 'POST',
        data: { model: model },
        cache: true,
        async: true,
    }).done(function (result) {

    }).fail(function (error) {

    })
});

Однако сериализованный div выглядит примерно так

model = "StudentName=Test&SchoolType=1b&SchoolType=26a"

Хотя эти значения находятся на стороне клиента, в AJAX значение StudentName отображается нормально, а значение SchoolType отображается как ноль на стороне сервера в контроллере. Как это исправить?

Возможная проблема: поскольку значение SchoolType является списком строк, оно не сопоставляется с отдельными строками.

РЕДАКТИРОВАТЬ 1: Я пытался изменить div в форме, но та же проблема сохраняется.

РЕДАКТИРОВАТЬ 2: Эта проблема решается в PHP путем изменения имени выбора. Этот ответ показывает пример.

1 Ответ

1 голос
/ 17 октября 2019

Пока я не уверен, что вы можете манипулировать частью сериализации;Вы можете получить эту структуру вручную.

Вы можете сериализовать другие элементы управления, например, как вы используете serialize (), и назначить их модели. А для Select2 сделайте это таким образом и добавьте в модель.

model = {};
$(".select2").each(function () {
    var selectedValue = $(this).val();
    if (selectedValue != null) {
        model[this.name] = selectedValue;
    }
}); 

Это даст вам необходимую структуру.

...