Свойства класса Свойства модели не являются обязательными - PullRequest
0 голосов
/ 06 сентября 2018

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 отображается с «Полем1» в атрибутах id и name.
  2. Поле 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. Поле 1: 123
  2. Filters_Field2: 456

РЕДАКТИРОВАТЬ

Если я использую объектно-ориентированную альтернативу Filters.Field2, упомянутую выше, POST будет выглядеть так:

  1. Поле 1: 123
  2. Фильтры [Field2]:

Таким образом, эта альтернатива не только продолжает ошибаться (см. Ниже!), Но также оставляет поле пустым.

Конец редактирования

Пока что это работает: я заполняю значения во входах, они POST'ы.

Затем в Controller \ Action , чья подпись, кстати:

    public ActionResult Search( SearchModel model )
    {
        (...)
    }

Я добавил часы к параметру модели и увидел, что:

  1. модель. Поле 1 заполнено "123".
  2. модель. Фильтры. Поле 2 пусто.

EDIT

До того, как Джон Х прокомментировал, в этот момент мне было интересно, что проблема была в привязке POST к модели.

После изучения решения Джона Х я понял, что проблема заключалась в вызове javascript AJAX, который неправильно отображает имя ключа POST (это должен быть Filter.Field2, а не Filter_Field2).

Таким образом, вопрос ниже был изменен на:

Конец редактирования

==> Как эффективно разместить POST поле Filters.Field2, используя javascript, и связать его с Filters.Field2 в модели?

1 Ответ

0 голосов
/ 06 сентября 2018

Редактировать

Я никогда раньше не использовал https://datatables.net, но мне кажется, что вам просто нужно изменить способ отправки данных при вызове AJAX. Что-то вроде:

var model = {
    Field1: $("#Field1").val(),
    Filters: {
        Field2: $("#Filters_Field2").val()
    }
};

config.ajax = {
    url: "@Url.Action( ... )",
    type: "POST",
    data: model
};

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

public class SearchModel
{
    [Display( ... )]
    public string Field1 { get; set; }

    public SearchFiltersModel Filters { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...