Подтвердить что ты не робот

Как переопределить значение DisplayFor boolean?

Как создать шаблон отображения, чтобы я мог отображать bool как Yes или No not checkbox? Используя mvc3

<%: Html.DisplayFor(model => model.SomeBoolean)%>
4b9b3361

Ответ 1

Мне нужно было создать нечто похожее, чтобы отобразить "Sim" и "Não" (португальский Yes/No). Я создал следующий файл:

 Views\Shared\DisplayTemplates\Boolean.ascx

И добавил следующий код:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<%= (bool) ViewData.Model ? "Sim" : "Não" %>

Надеюсь, это поможет!

ИЗМЕНИТЬ Забыл, на ваш взгляд, просто называть его так:

<%= Html.DisplayFor(i => item.Ativo) %>

РЕДАКТИРОВАТЬ 2 Для значения NULL (bool?) Попробуйте следующее:

<%= (ViewData.Model == null) ? "NA" : (ViewData.Model == true) ? "Y" : "N"%>

РЕДАКТИРОВАТЬ 3 Использование синтаксиса Razor (Views\Shared\DisplayTemplates\Boolean.cshtml):

 @{ Layout = null; }
 @(ViewData.Model ? "Sim" : "Não")

Ответ 2

Как насчет этой простой вещи:

@((bool)item.Ativo ? "Yes" : "No")

Ответ 3

Вы можете расширить HtmlHelper для bool.

и помните, что вы должны использовать направление пространства имен YesNoExtensions на странице бритвы. rem: мы можем перегрузить DisplayFor для логического значения со знаком изменения функции.

public namespace SampleExtensions
{
    public static class YesNoExtensions
    {
        public static MvcHtmlString DisplayFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, bool flag = true)
        {
            object o = expression.Compile().Invoke(html.ViewData.Model);
            if (o.GetType() == typeof(bool))
            {
                if ((bool)o)
                    return new MvcHtmlString("Yes");
                else
                    return new MvcHtmlString("No");
            }
            return DisplayFor(html, expression);
        }
    }
}

и страница бритвы.

<%@ import namespace='SampleExtensions' %>


<%: Html.DisplayFor(model => model.SomeBoolean, true)%>

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

Ответ 4

@Html.DisplayTextFor(model => model.SomeBoolean).

Используйте встроенный Display TextFor() вместо DisplayFor().

Это старый пост, но у меня возникли проблемы с поиском текущего ответа.

Ответ 5

Для истинного/ложного использования DisplayTextFor Джастина Гранта

Для yup/nope на основе Nuri YILMAZ, это .NetCore 2.2, для понижения рейтинга замените HtmlString на MvcHtmlString:

1) С# написать новое расширение DisplayForYZ

public namespace X.Views.Shared
{
    public static class DisplayExtensions
    {
        // If this was called DisplayFor not DisplayForYZ, we'd get recursion
        public static IHtmlContent DisplayForYZ<TModel, TValue>
          (this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) 
        where TModel : Y
        {
            object o = expression.Compile().Invoke(html.ViewData.Model);
            // For any bool on TModel, return in this custom way:
            if (o.GetType() == typeof(bool))
            {
                return (bool)o ? new HtmlString("Yup") : new HtmlString("Nope");
            }
            // Otherwise use default behaviour 
            return html.DisplayFor(expression);
        }
    }
}

2) cshtml: импортируйте пространство имен DisplayExtensions и используйте новое расширение.

@model X.ViewModels.Y
@using X.Views.Shared;

@Html.DisplayForYZ(modelItem => modelItem.Z)   @*//Yup/Nope*@
@Html.DisplayForYZ(modelItem => modelItem.A)   @*//default non bool behavior*@

@Html.DisplayFor(modelItem => modelItem.Z)     @*//check box*@
@Html.DisplayTextFor(modelItem => modelItem.Z) @*//true/false*@

X= {моя компания} Y= {объект для настраиваемого отображения} Z= {свойство bool} A= {свойство не bool}