How do I override DisplayFor boolean?

后端 未结 5 1119
醉话见心
醉话见心 2021-01-01 12:36

How do i create a display template so i can display a bool as Yes or No not a checkbox? Using mvc3

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


        
相关标签:
5条回答
  • 2021-01-01 13:15

    For true/false use DisplayTextFor by Justin Grant

    For yup/nope based on Nuri YILMAZ, this is .NetCore 2.2, to downgrade replace HtmlString with MvcHtmlString:

    1) C# write new extension 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: Import the DisplayExtensions namespace and use new extension.

    @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 = {my company} Y = {object for customised display} Z= {bool property} A= {non-bool property}

    0 讨论(0)
  • 2021-01-01 13:24

    you can extend HtmlHelper for bool.

    and remember you must use direction YesNoExtensions namespace on razor page . rem:we can overload DisplayFor for boolean with change function sign.

    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);
            }
        }
    }
    

    and razor page.

    <%@ import namespace='SampleExtensions' %>
    
    
    <%: Html.DisplayFor(model => model.SomeBoolean, true)%>
    

    last parameter true is dummy for select right DisplayFor which has been overload by us. I hope usefull.

    0 讨论(0)
  • 2021-01-01 13:31

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

    Use the in-built DisplayTextFor() instead on DisplayFor().

    This is an old post, but I was having trouble finding a current answer.

    0 讨论(0)
  • 2021-01-01 13:33

    I had to create something similar so it would display "Sim" and "Não" (portuguese Yes/No). I created the following file:

     Views\Shared\DisplayTemplates\Boolean.ascx
    

    And added the following code:

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

    Hope this helps!

    EDIT Forgot, in your view, simply call it like so:

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

    EDIT 2 For a nullable (bool?), try this:

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

    EDIT 3 Using Razor syntax (Views\Shared\DisplayTemplates\Boolean.cshtml):

     @{ Layout = null; }
     @(ViewData.Model ? "Sim" : "Não")
    
    0 讨论(0)
  • 2021-01-01 13:39

    How about just this simple thing:

    @((bool)item.Ativo ? "Yes" : "No")
    
    0 讨论(0)
提交回复
热议问题