模型的属性模型的属性未绑定

时间:2018-09-06 18:34:57

标签: asp.net-mvc

编辑

John H 的帮助下,由于新的发现,必须在某些方面对这个问题进行编辑。

编辑结束

我有以下模型

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. Field1在id和name属性中均使用“ Field1”呈现。
  2. Field2在id属性中均使用“ Filters_Field2”,在name属性中均使用“ Filters.Field2”进行渲染(请注意,其中一个使用下划线,另一个使用点作为分隔符)。

现在,我在Field1和Field2中分别写入了一些值(分别为“ 123”和“ 456”)。

然后我点击了Submit(提交)按钮。

编辑

我应该补充一点,此Submit按钮不是常规的Submit按钮:它是一个执行javascript函数的按钮,该函数会收集字段,然后像我们使用https://datatables.net/一样以AJAX格式发送它们:

    $("#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的开发者工具->网络)通过POST方式生成的值:

  1. 字段1:123
  2. Filters_Field2:456

编辑

如果我使用上面提到的Filters.Field2的面向对象替代方法,则POST将显示如下:

  1. 字段1:123
  2. 过滤器[Field2]:

因此,这种选择不仅继续使它做错(请参阅下文!),而且使该字段为空。

编辑结束

到目前为止,它似乎正在起作用:我在输入中填充值,它们是POST的。

然后,在 Controller \ Action 中,其签名是btw:

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

我在模型参数中添加了一块手表,发现:

  1. model.Field1填充为“ 123”。
  2. model.Filters.Field2为空。

编辑

在John H发表评论之前,我想知道问题出在POST到模型的绑定方面。

检查John H的解决方案后,我了解到问题出在javascript AJAX调用中,以错误的方式呈现POST的键名(它必须是Filter.Field2,而不是Filter_Field2)。

因此下面的问题被重构为:

编辑结束

==> 如何使用javascript有效地发布一个Filters.Field2字段,并使其与模型中的Filters.Field2绑定正确性?

1 个答案:

答案 0 :(得分:1)

编辑

我以前从未使用过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; }
}