首先,我在“视图”>“博客”>“显示模板”中有一个显示模板:
@model Domain.Model.BlogPost
<div class="blogSummary">
@Html.ActionLink(Model.Title, "post", new { Id = Model.PostID }, new { @class = "titleLink" })
<div class="subInfo">
Posted by @Model.Author on @Model.PostedDate.ToString("D") | @Model.PostComments.Count
Comment(s)</div>
<br />
<div class="summaryText">
@Html.Markdown(Model.Body.Length > 300 ? Model.Body.Remove(0, 300) + "..." : Model.Body)
@Html.ActionLink("(view more)", "post", new { Id = Model.PostID })
</div>
</div>
那么我有一个看法:
@model IEnumerable<Domain.Model.BlogPost>
@{
ViewBag.Title = "Index";
}
@Html.DisplayFor(x => x, "BlogPostSummary")
但是,我在
DisplayFor()
: 上遇到错误
模型项传入 字典的类型是 'System.Data.Objects.ObjectSet`1[Domain.Model.BlogPost]', 但这本词典需要一个模型 类型为“Domain.Model.BlogPost”的项目。
我有点难以理解发生了什么。使用显示模板的最佳方式是什么?
问题是您正在尝试传递一组 BlogPost,而需要的是单个 BlogPost。
尝试:
@Html.DisplayFor(x => x[0], "BlogPostSummary")
或者类似的东西:
@foreach (var post in Model)
@Html.Display(post)
注意:我不相信第二个示例是否正确使用了 Html.Display。我怀疑使用部分代码而不是显示模板会更好。
UI提示
默认情况下,ASP.NET MVC 依赖命名约定将类链接到 BlogPost.cshtml 显示模板。但是,如果您想使用 CustomBlogPost.cshtml 作为显示模板,则可以通过应用
BlogPost
属性来实现。UIHint
public class DomainModel {
[UIHint("CustomBlogPost")]
public BlogPost Post { get; set; }
}
循环遍历集合,并且仍然可以正常工作:
@Html.DisplayFor(x => x.First(), "BlogPostSummary")
在 lambda 表达式的左侧使用变量并不一定要求您也在右侧使用它。
@foreach(var blogPost in Model)
{
Html.DisplayFor(x => blogPost, "BlogPostSummary")
}
期待
DisplayFor
。 TModel 是模型的类型,例如 Expression<Func<TModel, TValue>>
,但 TValue 可以是您喜欢的任何类型。 因此,只要您拥有对集合中当前项目的引用(如上面的 foreach 所示),您就可以忽略 lambda 表达式的左侧。(但是你必须拥有
TModel。IEnumerable<BlogPost>
不起作用。)
Html.DisplayFor(() => blogPost, "BlogPostSummary")
隐式告诉 MVC 要传递的模型是传递视图的模型,即
@Html.DisplayFor()
您需要做的是枚举模型,并显示每个模型:
IEnumerable<Domain.Model.BlogPost>
确保 BlogPostSummary 位于正确的文件夹中,然后就可以开始了!
@foreach(var blogPost in Model){
Html.RenderPartial("BlogPostSummary", blogPost)
}
并从调用站点中删除
/Views/Shared/DisplayTemplates/BlogPost.cshtml
。所以:
模板
BlogPostSummary
/Views/Shared/DisplayTemplates/BlogPost.cshtml
无论您在何处尝试引用它:
@model Domain.Model.BlogPost
<div class="blogSummary">
@Html.ActionLink(Model.Title, "post", new { Id = Model.PostID }, new { @class = "titleLink" })
<div class="subInfo">
Posted by @Model.Author on @Model.PostedDate.ToString("D") | @Model.PostComments.Count
Comment(s)</div>
<br />
<div class="summaryText">
@Html.Markdown(Model.Body.Length > 300 ? Model.Body.Remove(0, 300) + "..." : Model.Body)
@Html.ActionLink("(view more)", "post", new { Id = Model.PostID })
</div>
</div>