List <t>在MVC5中提交表单绑定

时间:2016-02-12 14:48:53

标签: model asp.net-mvc-5 html-helper

我对MVC5很新。到目前为止,我似乎一直在寻找解决问题的方法,然而,我遇到了一个我无法找到解决方案的问题。

我正在创建两个视图,一个用于创建新的文章帖子,另一个用于编辑当前的文章帖子。

我的文章模型如下:

public class Article
{
    private int? _id;

    [BsonRequired]
    [DataType(DataType.Text)]
    [BsonElement("_id")]
    public int? Id
    {
        get { return _id ?? 999999; }
        set { _id = value; }
    }

    ...
    [HiddenInput]
    [BsonElement("related")]
    public List<Related> Related { get; set; }

    [HiddenInput]
    [BsonElement("comments")]
    public List<Comment> Comments { get; set; }

    [HiddenInput]
    [BsonElement("auto_publish")]
    public AutoPublish AutoPublish { get; set; }

}
}

我的问题在于模型项列表(如List<Comment>List<Related>)和自定义模型属性。

在我的Post和Edit视图中,我为所有模型属性设置了@ Html.HiddenFor属性,但是我很难 NOT 丢失我的自定义模型属性的值(比如AutoPublish)和我的模型属性列表。

如果我错了,请纠正我,但对于字符串项列表,我使用了以下逻辑:

     for (var i = 0; i < Model.Categories.Count; i++)
{
    @Html.HiddenFor(model => Model.Categories[i])
}

对于其他自定义列表,我尝试使用以下代码创建DisplayTemplate:

@model List<CMS.Models.Comment>

@foreach (var item in Model)
{
    @Html.HiddenFor(x => item.Date)
    @Html.HiddenFor(x => item.Email)
    @Html.HiddenFor(x => item.Enabled)
    @Html.HiddenFor(x => item.Ip)
    @Html.HiddenFor(x => item.Username)
    @Html.HiddenFor(x => item.PostId)
    @Html.HiddenFor(x => item.Text)
}

但是,当我尝试在我的视图中使用@ Html.DisplayForModel(&#34; Comments&#34;,Model.Comments)时,我得到的模型类型不匹配。

有人可以指出我正确的方向吗? 非常感谢你的时间。

1 个答案:

答案 0 :(得分:1)

DisplayForModel特定于视图的模型。你不能将任何随机对象传递给它。您可能正在寻找DisplayFor(m => m.Comments),但请记住,当您将可枚举传递给DisplayFor时,它实际上会为集合中的每个项呈现显示模板。换句话说,您需要删除部分视图中的foreach,并将模型声明更改为单个Comment而不是List<Comment>

修改

实际上,由于您要渲染HiddenInput,因此这应该是编辑器模板,您应该使用EditorForDisplayFor仅适用于展示。我说的其他所有内容仍然适用于EditorFor