如何覆盖DisplayFor boolean?

时间:2011-07-29 08:43:29

标签: asp.net-mvc-3 boolean checkbox display-templates

如何创建显示模板,以便我可以显示bool为是或否而不是复选框?使用mvc3

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

5 个答案:

答案 0 :(得分:22)

我必须创建类似的东西,以便显示“Sim”和“Não”(葡萄牙语是/否)。我创建了以下文件:

 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 对于可以为空的(bool?),试试这个:

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

编辑3 使用Razor语法(Views \ Shared \ DisplayTemplates \ Boolean.cshtml):

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

答案 1 :(得分:12)

这个简单的事情怎么样:

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

答案 2 :(得分:6)

你可以扩展HtmlHelper for bool。

并记住你必须在剃刀页面上使用方向YesNoExtensions命名空间。 rem:我们可以使用更改函数符号重载DisplayFor for boolean。

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是虚拟的。我希望有用。

答案 3 :(得分:6)

这是一篇旧帖子,但我找不到当前的答案。

在MVC 5中实际上是一个@HTML方法,@Html.Display**Text**For(model => model.SomeBoolean)

答案 4 :(得分:0)

对于真/假,请使用Justin Grant的DisplayTextFor

对于基于Nuri YILMAZ的yup / nope,这是.NetCore 2.2,以将MtHString降级为MvcHtmlString:

1)C#编写新的扩展名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 = {布尔属性} A = {非布尔属性}