【问题标题】:Collection in ViewModel gone after postbackViewModel 中的集合在回发后消失
【发布时间】:2016-03-18 15:47:18
【问题描述】:

我有以下 ViewModel:

public class ActivityReportViewModel
{
    public Dictionary<int, List<string>> Periods { get; set; }

    public List<Project> Projects { get; set; }

    public List<Templates> Templates { get; set; }

    public DateTime TimePeriod { get; set; }
}

public class Project
{
    public string Customer { get; set; }
    public string ProjectNumber { get; set; }
    public string ProjectDescription { get; set; }
    public bool IsSelected { get; set; }
    public int TemplateId { get; set; }
    public bool XLSX { get; set; }
    public bool PDF { get; set; }
}

我在我的控制器中填充这个 ViewModel,然后将它发送到我的 Create 视图,它工作正常并且 Projects 属性的值都在那里。但是,当我将数据回发到服务器时,这些值就消失了。我尝试为每个项目的所有属性提供 HiddenFields 无济于事。这是我的相关视图标记:

<div>
    @Html.LabelFor(model => model.Projects, htmlAttributes: new { @class = "ms-Label" })
    <ul class="ms-List" style="list-style:none;">
        @for (int x = 0; x < Model.Projects.Count; x++)
        {
            <li class="ms-ListItem">
                <span class="ms-ListItem-primaryText">@Model.Projects[x].ProjectDescription</span> 
                <span class="ms-ListItem-secondaryText">@Model.Projects[x].Customer</span> 
                <span class="ms-ListItem-tertiaryText">@Model.Projects[x].ProjectNumber</span> 
                @*<div class="ms-ListItem-selectionTarget js-toggleSelection"></div>*@
                @Html.HiddenFor(m => Model.Projects[x].IsSelected)
                @Html.HiddenFor(m => Model.Projects[x].ProjectDescription)
                @Html.HiddenFor(m => Model.Projects[x].Customer)
                @Html.HiddenFor(m => Model.Projects[x].ProjectNumber)
                @Html.HiddenFor(m => Model.Projects[x].XLSX)
                @Html.HiddenFor(m => Model.Projects[x].PDF)
                <div class="ms-Dropdown">
                    <i class="ms-Dropdown-caretDown ms-Icon ms-Icon--caretDown"></i>
                    @Html.DropDownListFor(m => m.Projects[x].TemplateId, new SelectList(Model.Templates, "Id", "Name"), new { @class = "ms-Dropdown-select" })
                </div>
                <div class="ms-ChoiceField">
                    <input id="excel+@Model.Projects[x].ProjectNumber" class="ms-ChoiceField-input" value="@Model.Projects[x].XLSX" type="checkbox">
                    <label for="excel+@Model.Projects[x].ProjectNumber" class="ms-ChoiceField-field"><span class="ms-Label is-required">Excel</span></label>
                </div>
                <div class="ms-ChoiceField">
                    <input id="pdf+@Model.Projects[x].ProjectNumber" class="ms-ChoiceField-input" value="@Model.Projects[x].PDF" type="checkbox">
                    <label for="pdf+@Model.Projects[x].ProjectNumber" class="ms-ChoiceField-field"><span class="ms-Label is-required">PDF</span></label>
                </div>
            </li>
        }
    </ul>
    <div>
        @Html.ValidationMessageFor(model => model.Projects, "", new { @class = "text-danger" })
    </div>            
</div>   

编辑:

这是我的 POST 操作方法:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ActivityReportViewModel report)
{
    using (AppContainer _db = new AppContainer())
    {

        if (ModelState.IsValid)
        {
            _db.SaveChanges();
            return RedirectToAction("Index");
        }

        return PartialView(report);
    }

}

【问题讨论】:

  • 显示 POST 创建操作。
  • 如果您删除了两个 &lt;div class="ms-ChoiceField"&gt; 元素中的代码(这没有意义并且没有绑定到任何东西 - 不确定您认为该代码会做什么)然后 Projects 属性您的模型将被正确填充。如果不是,那么您还有其他未向我们展示的导致问题的代码

标签: c# asp.net-mvc collections binding


【解决方案1】:

DefaultViewModel Binder 使用 HTML 属性 name 来确定要绑定回服务器上的哪个属性。我看不到您的输入元素上指定的name 属性。请使用视图模型的属性在要回发到服务器的元素上指定name 属性。

如下指定name 属性。请注意,我添加了 name 属性,其值为您的视图模型的属性

<input id="excel+@Model.Projects[x].ProjectNumber" class="ms-ChoiceField-input" name="@Model.Projects[x].ProjectNumber" value="@Model.Projects[x].XLSX" type="checkbox">

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多