Условные элементы отображения с Razor - PullRequest
6 голосов
/ 20 декабря 2011

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

@if(@Model.Atendimento.PrazosEEntregas.Visivel)
{
    <div>
        <h4>Prazos e entrega do serviço</h4>

        @if (!string.IsNullOrWhiteSpace(@Model.Atendimento.PrazosEEntregas.PrazoFinalizacaoServico))
        {
            <p>@Model.Atendimento.PrazosEEntregas.PrazoFinalizacaoServico</p>
        }

        @if (!string.IsNullOrWhiteSpace(@Model.Atendimento.PrazosEEntregas.PrazoRetiradaDocumento))
        {
            <p><strong>Prazo de retirar o documento:</strong> @Model.Atendimento.PrazosEEntregas.PrazoRetiradaDocumento</p>
        }

        @if (!string.IsNullOrWhiteSpace(@Model.Atendimento.PrazosEEntregas.OndeRetirarServico))
        {
            <p><strong>Onde retirar/receber:</strong> @Model.Atendimento.PrazosEEntregas.OndeRetirarServico</p>
        }

        @if (!string.IsNullOrWhiteSpace(@Model.Atendimento.PrazosEEntregas.ObservacaoPrazoRetirada))
        {
            <p><strong>Observação:</strong> @Model.Atendimento.PrazosEEntregas.ObservacaoPrazoRetirada</p>
        }
    </div>
}

Спасибо, Hoisel

Ответы [ 3 ]

7 голосов
/ 20 декабря 2011

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

public static class HtmlExtensions
{
    public static IHtmlString FormatValue(
        this HtmlHelper htmlHelper, 
        string value, 
        string label
    )
    {
        if (string.IsNullOrWhiteSpace(value))
        {
            return MvcHtmlString.Empty;
        }

        var result = string.Format(
            "<p><strong>{0}</strong> {1}</p>",
            htmlHelper.Encode(label),
            htmlHelper.Encode(value)
        );
        return new HtmlString(value);
    }
}

и затем:

@Html.FormatValue(
    Model.Atendimento.PrazosEEntregas.ObservacaoPrazoRetirada, 
    "Observação:"
)

Другая возможность - использовать шаблон отображения:

@Html.DisplayFor(x => x.Atendimento.PrazosEEntregas.ObservacaoPrazoRetirada)

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

@model string
@if (!string.IsNullOrWhiteSpace(Model))
{
    <p>
        <strong>@ViewData.ModelMetadata.DisplayName</strong>
        @ViewData.TemplateInfo.FormattedModelValue
    </p>
}

и на ваш взгляд модель:

[DisplayName("Observação:")]
[UIHint("MyTemplate")]
public string ObservacaoPrazoRetirada { get; set; }
2 голосов
/ 20 декабря 2011

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

<h4>Prazos e entrega do serviço</h4>

@{ PrazosEEntregas prazosEEntregas = Model.Atendimento.PrazosEEntregas; }

@if (!string.IsNullOrWhiteSpace(prazosEEntregas.PrazoFinalizacaoServico))
{
    <p>prazosEEntregas.PrazoFinalizacaoServico</p>
}
@if (!string.IsNullOrWhiteSpace(prazosEEntregas.PrazoRetiradaDocumento))
{
     //etc.
}

Я догадался о типе prazosEEntregas в вашем коде, возможно, вам придется заменить его направильный тип.

0 голосов
/ 20 декабря 2011

Работа представления не связана с логикой модели.Переместите эту логику в соответствующий контроллер.

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

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