Как я могу передать содержимое HTML в частичное представление в MVC-Razor, как блок "для" - PullRequest
12 голосов
/ 06 марта 2012

Я использую тему Chromatron для панели администратора в моем приложении. Существует гаджет боковой панели с HTML-контентом, и с помощью небольшого трюка CSS он может отображаться совершенно по-другому.

<section class="sidebar nested">
    <h2>Nested Section</h2>
    <p>Lorem ipsum dolor sit amet, conse ctetur adipiscing elit. Maec enas id augue ac metu aliquam.</p>
    <p>Sed pharetra placerat est suscipit sagittis. Phasellus <a href="#">aliquam</a> males uada blandit. Donec adipiscing sem erat.</p>
</section>

Я хочу иметь частичное представление, которое используется следующим образом:

@Html.Partial("Path/To/Partial/View"){
    <h2>Nested Section</h2>
    <p>Lorem ipsum dolor sit amet, conse ctetur adipiscing elit. Maec enas id augue ac metu aliquam.</p>
    <p>Sed pharetra placerat est suscipit sagittis. Phasellus <a href="#">aliquam</a> males uada blandit. Donec adipiscing sem erat.</p>
}

TBH, я хочу иметь такую ​​же функциональность, как в блоке @for(...){ }. Возможно ли это в Razor?

Ответы [ 2 ]

21 голосов
/ 22 апреля 2013

У меня была та же самая дилемма. Попробуйте создать тип модели представления со свойством Func, а затем передайте HTML как делегат.

public class ContainerViewModel
{
    public String Caption { get; set; }
    public String Name { get; set; }
    public Int32 Width { get; set; }
    public Func<object, IHtmlString> Content { get; set; }
}

@Html.Partial("Container", new ContainerViewModel()
{
    Name = "test",
    Caption = "Test container",
    Content =  
    @<text>
       <h1>Hello World</h1>
    </text>,
    Width = 600
})

Вы можете назвать это так в своей части.

@Model.Content(null)

Если вы хотите быть модным, вы можете добавить этот метод расширения.

public static class PartialExtensions
{
    public static IHtmlString Display<T>
        (this T model, Expression<Func<T, Func<Object, IHtmlString>>> content) 
    {
        var compiled = content.Compile();
        return compiled.Invoke(model).Invoke(null);
    }
}

Затем, каждый раз, когда вы используете этот шаблон, вы можете назвать его таким образом в своей части (не полностью протестированной).

@model ContainerViewModel
@Model.Display(m => m.Content)  // Use delegate property

Надеюсь, это работает для вас.

Это работает, потому что синтаксис @ ... создает для вас небольшой HtmlHelper, который использует модель (которую вы объявляете здесь как тип object, и передаете null для) и возвращает IHtmlString.

Осторожно, значения форм не отправляются на сервер, если в содержимом используется @ Html.BeginForm.

Поэтому оберните свою форму вокруг контейнера.

0 голосов
/ 30 марта 2012

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

...