ASP.NET MVC 3显示模板问题

时间:2011-03-16 19:40:17

标签: c# asp.net-mvc templates asp.net-mvc-3 razor

首先,我在视图中有一个显示模板>博客> 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”类型的项目。

我在理解正在发生的事情时遇到了一些麻烦。使用显示模板的最佳方法是什么?

4 个答案:

答案 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位于正确的文件夹中,您应该好好去!