EDIT
Этот вопрос должен был быть отредактирован в некоторых пунктах из-за новых открытий после некоторой помощи Джона Х , указывающей мне правильное направление в понимании этой проблемы.
Конец редактирования
У меня есть эти Модели :
public class SearchModel
{
public SearchModel()
{
Filters = new SearchFiltersModel();
}
[Display( ... )]
public string Field1 { get; set; }
public SearchFiltersModel Filters { get; set; };
}
public class SearchFiltersModel
{
[Display( ... )]
public string Field2 { get; set; }
}
Затем в Просмотр :
@model SearchModel
@using ( Html.BeginForm( ... ) )
{
@Html.TextBoxFor( m => m.Field1, null, new { @class = "form-control" } )
@Html.TextBoxFor( m => m.Filters.Field2, null, new { @class = "form-control" } )
(...)
}
Я вижу в сгенерированном HTML:
- Поле1 отображается с «Полем1» в атрибутах id и name.
- Поле 2 отображается с «Filters_Field2» в атрибуте id и «Filters.Field2» в атрибуте имени (обратите внимание, что один использует подчеркивание, а другой использует точку в качестве разделителя).
Теперь я написал несколько значений в Field1 и Field2 («123» и «456» соответственно).
Затем я нажал кнопку «Отправить».
EDIT
Я должен добавить, что эта кнопка отправки не является обычной кнопкой отправки: это кнопка, которая выполняет функцию javascript, которая собирает поля, а затем отправляет их AJAX'ly, поскольку мы используем https://datatables.net/:
$("#Search_Execute").click(() => {
table.destroy();
config.ajax = {
url: "@Url.Action( ... )",
type: "POST",
data: function (d) {
d.Field1 = $("#Field1").val();
d.Filters_Field2 = $("#Filters_Field2").val();
}
};
table = $("...").DataTable(config);
Обратите внимание, что я написал d.Filters_Field2 вместо d.Filters.Field2. Если я изменим подчеркивание на точку, мне нужно будет добавить ...
d.Filters = new Object();
... перед настройкой d.Filters.Field2. Это тоже не сработает (см. Ниже).
Конец редактирования
Я мог видеть (например, с помощью Chrome Developer Tools -> Network) значения, помещаемые POST следующим образом:
- Поле 1: 123
- Filters_Field2: 456
РЕДАКТИРОВАТЬ
Если я использую объектно-ориентированную альтернативу Filters.Field2, упомянутую выше, POST будет выглядеть так:
- Поле 1: 123
- Фильтры [Field2]:
Таким образом, эта альтернатива не только продолжает ошибаться (см. Ниже!), Но также оставляет поле пустым.
Конец редактирования
Пока что это работает: я заполняю значения во входах, они POST'ы.
Затем в Controller \ Action , чья подпись, кстати:
public ActionResult Search( SearchModel model )
{
(...)
}
Я добавил часы к параметру модели и увидел, что:
- модель. Поле 1 заполнено "123".
- модель. Фильтры. Поле 2 пусто.
EDIT
До того, как Джон Х прокомментировал, в этот момент мне было интересно, что проблема была в привязке POST к модели.
После изучения решения Джона Х я понял, что проблема заключалась в вызове javascript AJAX, который неправильно отображает имя ключа POST (это должен быть Filter.Field2, а не Filter_Field2).
Таким образом, вопрос ниже был изменен на:
Конец редактирования
==> Как эффективно разместить POST поле Filters.Field2, используя javascript, и связать его с Filters.Field2 в модели?