如何覆盖DisplayFor boolean?

new*_*_86 21 checkbox boolean display-templates asp.net-mvc-3

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

<%: Html.DisplayFor(model => model.SomeBoolean)%>
Run Code Online (Sandbox Code Playgroud)

mat*_*scb 22

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

 Views\Shared\DisplayTemplates\Boolean.ascx
Run Code Online (Sandbox Code Playgroud)

并添加了以下代码:

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

希望这可以帮助!

编辑 忘了,在你看来,简单地称之为:

<%= Html.DisplayFor(i => item.Ativo) %>
Run Code Online (Sandbox Code Playgroud)

编辑2 对于可空(bool?),试试这个:

<%= (ViewData.Model == null) ? "NA" : (ViewData.Model == true) ? "Y" : "N"%>
Run Code Online (Sandbox Code Playgroud)

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

 @{ Layout = null; }
 @(ViewData.Model ? "Sim" : "Não")
Run Code Online (Sandbox Code Playgroud)

  • 只是一个建议:尽量避免可空的布尔值.很多次布尔?对于应用程序,= false,与bool = false相同.此外,很多时候最终用户无法区分空值和假值(对于布尔数据类型).基本上,如果您使用复选框来控制布尔值,请跳过null.如果您需要三态(null,true,false),您将使用某种下拉列表或特殊指示缺少值的精美复选框! (2认同)
  • 我正在努力将其转换为Razor语法.有人可以帮忙吗? (2认同)

Jer*_*xon 13

这个简单的事情怎么样:

@((bool)item.Ativo ? "Yes" : "No")
Run Code Online (Sandbox Code Playgroud)


Nur*_*MAZ 7

你可以扩展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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和剃刀页面.

<%@ import namespace='SampleExtensions' %>


<%: Html.DisplayFor(model => model.SomeBoolean, true)%>
Run Code Online (Sandbox Code Playgroud)

最后一个参数true是虚拟的选择权DisplayFor由我们重载.我希望有用.


Jus*_*ant 6

这是一个老帖子,但我找不到当前的答案.

在MVC 5中实际上有一个@HTML方法@Html.DisplayTextFor(model => model.SomeBoolean).