Проблема с шаблоном отображения ASP.NET MVC 3 - PullRequest
2 голосов
/ 16 марта 2011

Сначала у меня есть шаблон отображения в представлениях> Блог> Шаблоны отображения:

@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 ]

4 голосов
/ 16 марта 2011

Проблема в том, что вы пытаетесь передать коллекцию BlogPosts, когда ожидается один 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; }
} 
2 голосов
/ 24 марта 2011

Я работал над той же проблемой, и я думаю, что у меня есть лучшее решение для вас. Вы можете перебрать коллекцию и заставить работать:

@foreach(var blogPost in Model)
{
    Html.DisplayFor(x => blogPost, "BlogPostSummary")
}

Использование переменной в левой части лямбда-выражения не обязательно требует, чтобы вы также использовали ее в правой части. DisplayFor ожидает Expression<Func<TModel, TValue>>. TModel - это тип вашей модели, например IEnumerable<BlogPost>, но TValue может быть любым. Таким образом, если у вас есть ссылка на текущий элемент в вашей коллекции, как в предыдущем разделе, вы можете игнорировать левую часть лямбда-выражения.

(Но вы должны иметь модель TM. Html.DisplayFor(() => blogPost, "BlogPostSummary") не работает.)

2 голосов
/ 16 марта 2011

Попробуйте, может быть,

@Html.DisplayFor(x => x.First(), "BlogPostSummary")
0 голосов
/ 16 марта 2011

По сути, это потому, что выполнение @Html.DisplayFor() неявно говорит MVC, что передаваемой моделью является модель передаваемого представления, то есть IEnumerable<Domain.Model.BlogPost>

Вам нужно перечислить модель и отобразить каждую из них:

@foreach(var blogPost in Model){

    Html.RenderPartial("BlogPostSummary", blogPost)

}

Убедитесь, что BlogPostSummary находится в правильной папке, и вы должны хорошо идти!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...