类的属性 模型的属性不绑定



>编辑

这个问题必须在某些地方进行编辑,因为在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. 字段 1 在 id 和名称属性中都使用"字段 1"呈现。
  2. Field2 在 id 属性中
  3. 都以"Filters_Field2"呈现,在名称属性中以"Filters.Field2"呈现(请注意,一个使用下划线,另一个使用点作为分隔符(。

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

然后我点击了提交按钮。

编辑

我应该补充一点,这个提交按钮不是一个常规的提交按钮:它是一个执行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 的开发者工具 -> 网络(以这种方式发布的值:

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

编辑

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

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

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

编辑结束

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

然后,在控制器\操作中,哪个签名是,顺便说一句:

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

我在模型参数中添加了一个手表,并看到:

  1. 型。字段 1 填充有"123"。
  2. 型。Filters.Field2 为空。

编辑

在 John H 发表评论之前,在这一点上,我想知道问题出在 POST 到模型绑定端。

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

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

编辑结束

==>如何使用 javascript 有效地发布 Filters.Field2 字段,并让它绑定到模型中的 Filters.Field2

Edit

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

相关内容

  • 没有找到相关文章

最新更新