首先,我在视图中有一个显示模板>博客> DisplayTemplates:
@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”类型的项目。
我在理解正在发生的事情时遇到了一些麻烦。使用显示模板的最佳方法是什么?
答案 0 :(得分:4)
问题是当你想要一个BlogPost时,你正试图传递一组BlogPost。
尝试:
@Html.DisplayFor(x => x[0], "BlogPostSummary")
或类似的东西:
@foreach (var post in Model)
@Html.Display(post)
注意:我不相信第二个例子正确使用Html.Display。我怀疑使用部分代替显示模板可以更好地提供代码。
<强> UIHint 强>
默认情况下,ASP.NET MVC依赖于命名约定来将类BlogPost
链接到BlogPost.cshtml显示模板。但是,如果您希望使用CustomBlogPost.cshtml作为显示模板,则可以通过应用UIHint
属性来执行此操作。
public class DomainModel {
[UIHint("CustomBlogPost")]
public BlogPost Post { get; set; }
}
答案 1 :(得分:2)
试试这个
@Html.DisplayFor(x => x.First(), "BlogPostSummary")
答案 2 :(得分:2)
我一直在研究同样的问题,我想我有更好的解决方案。你可以遍历集合并仍然可以使用它:
@foreach(var blogPost in Model)
{
Html.DisplayFor(x => blogPost, "BlogPostSummary")
}
在lambda表达式的左侧使用变量并不一定要求您在右侧使用它。 DisplayFor
需要Expression<Func<TModel, TValue>>
。 TModel是您的模型的类型,例如IEnumerable<BlogPost>
,但TValue可以是您喜欢的任何类型。因此,只要您在集合中引用了当前项目,就像上面的foreach一样,您可以忽略lambda表达式的左侧。
(但你必须拥有 TModel。Html.DisplayFor(() => blogPost, "BlogPostSummary")
不起作用。)
答案 3 :(得分:0)
基本上是因为执行@Html.DisplayFor()
隐式告诉MVC要传递的模型是传递视图的模型,即IEnumerable<Domain.Model.BlogPost>
您需要做的是对模型进行枚举,并显示每个模型:
@foreach(var blogPost in Model){
Html.RenderPartial("BlogPostSummary", blogPost)
}
确保BlogPostSummary位于正确的文件夹中,您应该好好去!