首页 > 解决方案 > 模型的类属性的属性不具有约束力

问题描述

编辑

由于在约翰 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”)。

然后我点击了提交按钮。

编辑

我应该补充一点,这个提交按钮不是一个常规的提交按钮:它是一个执行 javascript 函数的按钮,该函数收集字段,然后以 AJAX 方式发送它们,就像我们使用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.F​​ilters.Field2 之前。它也不起作用(见下文)。

编辑结束

我可以看到(例如使用 Chrome 的开发者工具 -> 网络)以这种方式发布的值:

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

编辑

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

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

因此,该替代方案不仅继续做错事(见下文!),而且还使该字段为空。

编辑结束

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

然后,在Controller\Action中,签名是,顺便说一句:

    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?

标签: asp.net-mvc

解决方案


编辑

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

推荐阅读