【问题标题】:Can't bind checkbox in partial view to the main model (MVC)无法将部分视图中的复选框绑定到主模型(MVC)
【发布时间】:2018-11-29 07:00:35
【问题描述】:

我一直在遇到问题,我一直在寻找答案,但没有任何帮助。

我有一个模型:

public class Filters
{
    public bool Filter1 { get; set; }
    public bool Filter2 { get; set; }
    public bool Filter3 { get; set; }
    etc...
}

我有一个带有多个复选框的部分视图并尝试了多种方法:

<input id="Filter1" name="Filter1" type="checkbox" value="true">
<input type="hidden" value="false" name="Filter1" />

@Html.CheckBoxFor(model => model.Filter1)

然后我有一个主模型:

public class Dashboard
{
    ...
    public Filters FiltersDashboard { get; set; }
}

我在主视图的某处插入部分视图,如下所示:

@Html.EditorFor(model => model.FiltersDashboard, "Filters")

在 jquery 中,当单击复选框并显示复选框的值时,我会执行警报。该值保持不变。

<script>
    $("#Filter1").click(function () {
        alert(" @Model.FiltersDashboard.Filter1 ")
    });
</script>

编辑:也在 .submit 函数中尝试过,但模型值保持不变:

<script>
    $("#searchform").submit(function (event) {
        alert(" @Model.FiltersDashboard.Filter1 ")
        event.preventDefault();
    });
</script>

这告诉我有些东西没有正确绑定,但我不知道我做错了什么。

另外,我不使用复选框列表的原因是我需要为每个过滤器执行不同的查询,因此我需要它们的特定名称和绑定。

【问题讨论】:

  • alert(" @Model.FiltersDashboard.Filter1 ") 将显示视图生成时模型的Filter1的值。复选框和模型之间的绑定将在表单发布到控制器时完成
  • @StephenMuecke 我在您提到的文件夹中有部分视图。在这种情况下,第二个参数真的很重要吗?部分视图正确加载。
  • @StephenMuecke 我不知道这是从局部视图绑定的正确方法。感谢您的反馈。我会按照你说的尝试绑定它。

标签: asp.net-mvc checkbox partial-views model-binding


【解决方案1】:

@Model.FiltersDashboard.Filter1 是剃须刀代码,在发送到视图之前在服务器上执行,所以它只会返回属性的初始值(如果你检查源代码,你会看到初始值已经硬编码在您的脚本中)。

但是,如果您的脚本正在执行,则意味着您在第二个代码 sn-p 中使用了手动 &lt;input&gt; 标签,在这种情况下,您的视图没有绑定到您的模型,因为正确的 name属性为name="FiltersDashboard.Filter1",关联的id 属性为id="FiltersDashboard_Filter1"

始终使用强类型 @Html.CheckBoxFor(),它将为 2 向模型绑定和客户端验证生成正确的 html。

还要注意,它只需要是@Html.EditorFor(model =&gt; model.FiltersDashboard) - 第二个参数是不必要的。

那么脚本应该是

<script>
    $('#FiltersDashboard_Filter1').click(function () {
        var isChecked = $(this).is(':checked');
        alert(isChecked);
    });
</script>

【讨论】:

  • 这是否意味着检查模型布尔值的唯一方法是将模型传递给控制器​​而不是脚本中的post方法?
  • 对不起,我不明白你的评论。我展示的脚本会告诉你复选框是否被选中。但是您的模型是服务器端代码。浏览器对此一无所知(它不理解 C# - 它唯一的编程语言是 javascript)
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2018-07-24
相关资源
最近更新 更多