MVC3 - связь между шаблоном и представлением - PullRequest
3 голосов
/ 09 января 2012

Я использую MVC3 (с синтаксисом Razor).

Вот что я собираюсь сделать: часть моего shared/_Layout.cshtml, который ищет в ViewBag List<RelatedLinks>, если он там отображается, то он отображает список связанных ссылок на панели инструментов страницы (что неудивительно). Некоторые из моих страниц будут заполнять эту коллекцию, некоторые не будут. Когда я заполняю сумку из моего контроллера, она прекрасно работает.

Однако контроллер не кажется подходящим местом для их определения, он специфичен для вида и похож на логику навигации - поэтому я хотел бы определить их в разметке вида.

Я пытался добавить их в ViewBag из вида, но, похоже, это не работает. Даже если я объявлю раздел на моем _Layout.cshtml, который находится перед областью, в которой отображаются ссылки, коллекция окажется пустой. Либо я делаю что-то не так, либо они не позволяют мне заполнить ViewBag из представления (что имело бы смысл).

С чем моя проблема сводится к следующему: я хочу, чтобы мои страницы сигнализировали _Layout.cshtml, когда они хотят, чтобы этот раздел отображался, и предоставлял список ссылок. Я не хочу, чтобы мои дочерние страницы беспокоились о том, как мы заполняем или рисуем список - я только хочу, чтобы он определял, что находится в списке. Есть идеи? Я перепробовал довольно много вещей (HtmlHelpers, контроллер подклассов и т. Д.), Но мне кажется, что я упускаю что-то очевидное.

Ответы [ 3 ]

2 голосов
/ 09 января 2012

Вместо того, чтобы _Layout.cshtml отображать ссылки, почему бы не создать вместо этого частичное представление?

В _Layout добавьте необязательный раздел

@RenderSection("RelatedLinks", false)

На ваш взгляд,

// Build your list of links
@section RelatedLinks {
    @Html.Partial("Navigation", YourLinks)
}

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

1 голос
/ 09 января 2012

Примерно так должно работать нормально:

_Layout.cshtml:

if(IsSectionDefined("Links")){
    @RenderSection("Links");

    @foreach(var link in ViewBag.Links)
    {
        <a href="@link.href">@link.text</a>
    }
}

MyView.cshtml:

@section Links{
    @{
        ViewBag.Links = new List { new {href="stackoverflow.com", text = "Stackoverflow"}};
    }

}
0 голосов
/ 09 января 2012

Вы отмечаете, что если список связанных ссылок относится только к представлению, он заслуживает того, чтобы его рассматривали как логику навигации, а не как логику приложения. «Жесткое кодирование» списка ссылок в представлении кажется правильным подходом.

Тем не менее, вы определенно хотите отделить логику, которая отображает список ссылок от самого списка ссылок ( data ). Частичное представление должно работать хорошо для этого. Просто определите частичное, которое принимает список связанных ссылок (возможно, в форме заголовка страницы плюс необработанный URL-адрес, или маршрут, или все, что вам подходит).

В каждом представлении, где вы хотите отобразить список связанных ссылок, определите список и передайте его в партиал для рендеринга:

1. MyView.cshtml

@{
    var relatedLinks = new Dictionary<string, string>() {
        { "Link one", "/foo" },
        { "Link two", "/foo" }
    };
}
@Html.Partial("RelatedLinks", relatedLinks)

1. RelatedLinks.cshtml

<ul>
@foreach(var link in model) {
    <li>@Html.Link(model.Key, model.Value)</li>
}
</ul>

Вы можете поместить все это в @Section и сказать _Layout.cs, что визуализируйте раздел «связанных ссылок» на странице, только если вы действительно определили такой раздел в своем представлении.

2. MyView.cshtml

@Section Links {
    @{
        var relatedLinks = new Dictionary<string, string>() {
            { "Link one", "/foo" },
            { "Link two", "/foo" }
        };
    }
    @Html.Partial("RelatedLinks", relatedLinks)
}

2. _Layout.cshtml

@RenderSection("Links", required: false); // Optional section
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...