ASP.NET MVC 3 显示模板问题

问题描述 投票:0回答:5

首先,我在“视图”>“博客”>“显示模板”中有一个显示模板:

@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”的项目。

我有点难以理解发生了什么。使用显示模板的最佳方式是什么?

c# asp.net-mvc templates asp.net-mvc-3 razor
5个回答
4
投票

问题是您正在尝试传递一组 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



2
投票

public class DomainModel { [UIHint("CustomBlogPost")] public BlogPost Post { get; set; } }



2
投票
可以

循环遍历集合,并且仍然可以正常工作: @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>不起作用。)

    


0
投票
Html.DisplayFor(() => blogPost, "BlogPostSummary")

隐式告诉 MVC 要传递的模型是传递视图的模型,即

@Html.DisplayFor()
您需要做的是枚举模型,并显示每个模型:

IEnumerable<Domain.Model.BlogPost>

确保 BlogPostSummary 位于正确的文件夹中,然后就可以开始了!


0
投票
@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>

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.