List<T> 在 MVC5 中提交表单绑定
List<T> submit form binding in MVC5
我是 MVC5 的新手。到目前为止,我似乎已经找到了解决问题的方法,但是,我遇到了一个我无法找到解决方案的问题。
我正在创建两个视图,一个用于创建新文章 Post,另一个用于编辑当前文章 Posts。
我的文章模型如下:
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 和编辑视图中,我为我的所有模型属性设置了 @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("Comments", Model.Comments) 时,出现模型类型不匹配的情况。
有人能给我指出正确的方向吗?
非常感谢您的宝贵时间。
DisplayForModel
特定于视图的模型。您不能将任何随机 object 传递给它。您可能正在寻找 DisplayFor(m => m.Comments)
,但请记住,当您将可枚举传递给 DisplayFor
时,它实际上会呈现 each 项的显示模板collection。换句话说,您需要删除局部视图中的 foreach
,并将模型声明更改为单个 Comment
而不是 List<Comment>
.
编辑
实际上,由于您正在渲染 HiddenInput
,因此这应该是一个 编辑器 模板,并且您应该使用 EditorFor
。 DisplayFor
仅用于显示。我所说的其他所有内容仍然适用于 EditorFor
.
我是 MVC5 的新手。到目前为止,我似乎已经找到了解决问题的方法,但是,我遇到了一个我无法找到解决方案的问题。
我正在创建两个视图,一个用于创建新文章 Post,另一个用于编辑当前文章 Posts。
我的文章模型如下:
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 和编辑视图中,我为我的所有模型属性设置了 @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("Comments", Model.Comments) 时,出现模型类型不匹配的情况。
有人能给我指出正确的方向吗? 非常感谢您的宝贵时间。
DisplayForModel
特定于视图的模型。您不能将任何随机 object 传递给它。您可能正在寻找 DisplayFor(m => m.Comments)
,但请记住,当您将可枚举传递给 DisplayFor
时,它实际上会呈现 each 项的显示模板collection。换句话说,您需要删除局部视图中的 foreach
,并将模型声明更改为单个 Comment
而不是 List<Comment>
.
编辑
实际上,由于您正在渲染 HiddenInput
,因此这应该是一个 编辑器 模板,并且您应该使用 EditorFor
。 DisplayFor
仅用于显示。我所说的其他所有内容仍然适用于 EditorFor
.