【问题标题】:Model binding not working inside a partial view模型绑定在局部视图中不起作用
【发布时间】:2014-07-08 17:12:30
【问题描述】:

我目前遇到的问题是,在我的部分视图中,MVC 框架没有正确绑定复选框。无论复选框是否被选中,CaseViewModel.IsCaseSelected 属性都将始终为 false。但是,如果我在父视图中对 html 进行硬编码而不是呈现部分视图,则 CaseViewModel.IsCaseSelected 属性将被正确设置为与复选框相对应。

我的代码如下所示。

在我看来,表单看起来像这样:

<div class="form-group">
<div>
    <label for="ProfileName">Profile Name:</label>
    <input type="text" name="ProfileName"><br>
</div>

@Html.Partial("~/Views/Shared/_CasesSelection.cshtml", Model.Cases_Category1)

<div id="category2-cases">
    <p>category-2</p>
    <label for="select-all">Select all</label>
    <input id="select-all" type="checkbox" onclick="select_all_toggle(this)" />
    @for (int i = 0; i < Model.Cases_Category2.Count; i++)
    {
        @Html.Label(Model.Cases_Category2[i].CasesNumber.ToString())
        @Html.CheckBoxFor(model => model.Cases_Category2[i].IsCaseSelected)
    }
</div>

<div>
    <input type="submit" value="Create" class="btn btn-default" />
</div>

我的局部视图如下所示:

@model List<Models.CaseViewModel>

<div id="some-case">
    <p>some-case</p>
    <label for="select-all">Select all</label>
    <input id="select-all" type="checkbox" onclick="select_all_toggle(this)" />
    @for (int i = 0; i < Model.Count; i++)
    {
        @Html.Label(Model[i].CaseNumber.ToString())
        @Html.CheckBoxFor(model => model[i].IsCaseSelected)
    }
</div>

它绑定的模型如下所示:

public class TestProfileVM
{
    [Required]
    [RegularExpression(@"^[a-zA-Z0-9-_]+$")]
    public string ProfileName { get; set; }

    public List<CaseViewModel> Cases_Category1 { get; set; }
    public List<CaseViewModel> Cases_Category2 { get; set; }
}

最后,CaseViewModel 看起来像这样:

public class CaseVM
{
    public string CaseType { get; set; }
    public int CaseNumber { get; set; }
    public bool IsCaseSelected { get; set; }
}

附加信息:

此外,在我的父视图中,当我将 Model.Cases_Category2[i] 替换为 Model.Cases_Category2.ElementAt(i) 时,绑定无法正常工作。这是什么原因,可能与原始问题有关吗?谢谢。

【问题讨论】:

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


    【解决方案1】:

    我猜问题是checkbox 内部部分视图的name。因此,您将视图模型的一部分传递给部分页面,复选框的名称将在您传递给部分页面的模型上生成。

    因此,将父视图内复选框的生成名称与部分视图内的复选框名称进行比较,如果它们不同,则将部分页面内的复选框名称更改为父页面内的复选框名称。

    【讨论】:

    • 你好,问题确实是我的局部视图中的复选框名称与父视图中的名称不匹配。原因是我的模型不同。如何修改我的局部视图以更改复选框的名称,同时保持绑定?新的 {name="name-here"} 被 Html.CheckBoxFor() 的实现覆盖。
    • 将 ViewModel 传递给部分页面,而不是将部分 ViewModel 传递给部分页面。
    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2016-06-14
    • 2013-09-26
    • 2011-10-11
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多