Помощники Razor, разделяющие проблему html с блоками кода - PullRequest
5 голосов
/ 02 августа 2011

Полагаю, что я хочу сделать так, чтобы мои данные были «цепями», чтобы они выглядели одинаково.Весь мой html должен быть обёрнут в какую-то форму

<fieldset class="" data-role="">

Так что у меня есть помощник, который печатает различные формы.Один из них будет меткой:

<fieldset data-role="@role">
    <label>@Html.Raw(label)</label>
</fieldset>

Теперь, когда у меня несколько типов меток, одна включает в себя кодовый блок.Когда это простой фрагмент текста, такой как «Имя», я делаю:

@FieldSet.Label("First Name")

Но когда у меня есть блок кода, такой как:

<b>some text</b>
<p>some other text (some time frame - some time frame)

Его становится сложно использоватьэто:

@FieldSet.Label("<b>" + Model.Text1 + "</b><p>" + Model.Text2 + 
    " (" + Model.Time1 + " - " + Model.Time2 +")</p>")

Что я хочу это решение, которое выглядит примерно так:

@FieldSet.Label(@<text>
<b>@Model1.Text1</b>
<p>@Model.Text2 (@Model.Time1 - @Model.Time2)</p>
</text>)

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

Ответы [ 2 ]

4 голосов
/ 02 августа 2011

Проверьте эту статью от Фила Хаака

Вы могли бы:

Запись в качестве метода расширения для строго типизированного HtmlHelper:

public static class RazorExtensions
{
    public static HelperResult Label<T>(this HtmlHelper<T> helper, Func<T, HelperResult> template) {
        return new HelperResult(writer => {
            writer.Write("<label>");
            template(helper.ViewData.Model).WriteTo(writer);
            writer.Write("</label>");
        });
    }
}

Чтобы вы могли написать

@Html.Label(@<text><span>@Model.Item1<span><strong>@Model.Item2</strong></text>)

Передать модель в качестве параметра вашему вспомогательному методу

public static class FieldSet
{
    public static HelperResult Label<T>(this T model, Func<T, HelperResult> template) {
        return new HelperResult(writer => {
            writer.Write("<label>");
            template(model).WriteTo(writer);
            writer.Write("</label>");
        });
    }
}

Использование:

@FieldSet.Label(Model, @<div><span>@Model.UserName</span><strong>@Model.FullName</strong><p>@Model.Description</p></div>)
3 голосов
/ 02 августа 2011

Вы можете посмотреть, как реализован @Html.BeginForm.

Создайте класс, который реализует IDisposable и напрямую записывает в поток ответа:

Ваш код может выглядеть следующим образом (введено головой, не проверено):

class FieldSet : IDisposable {
     public FieldSet(string label) {
          // TODO: Encode label on line below
          HttpContext.Current.Response.Write(string.Format("<fieldset><label =\"{0}\"", label));
     }

    public void Dispose() {
        HttpContext.Current.Response.Write("</fieldset>");
    }
}

static class FieldSetExtionsions {
    public static FieldSet FieldSet(this HtmlHelper html, string label) {
        return new FieldSet(label);
    }
}

Использование будет:

@using (Html.FieldSet("your label")) {
     <div>
         Your razor code goes here
     </div>
}
...