2011-07-29 15 views
20

¿Cómo creo una plantilla de visualización para que pueda mostrar un bool como Sí o No, no como casilla de verificación? Usando mvc3¿Cómo invalido DisplayFor boolean?

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

Respuesta

22

Tuve que crear algo similar para que aparezca "Sim" y "Não" (portugués Sí/No). He creado el siguiente archivo:

Views\Shared\DisplayTemplates\Boolean.ascx 

y ha añadido el siguiente código:

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

Espero que esto ayude!

EDITAR olvidaba, en su opinión, sólo tiene que llamarlo así:

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

EDIT 2 Para una anulable (? Bool), intente esto:

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

EDIT 3 Uso de la sintaxis de Razor (Views \ Shared \ DisplayTemplates \ Boolean.cshtml):

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

Tuve que agregar un molde a un booleano como este: '<% = (bool) ViewData.Model? "Sí": "No"%> ' Gracias, ¡funcionó de maravilla! – xcer

+0

gracias por la sugerencia @xcer, hemos actualizado el código anterior. – mateuscb

+2

Solo una sugerencia: intente evitar los booleanos que pueden anularse. Muchas veces bool? = falso es, para la aplicación, lo mismo que bool = falso. Además, muchas veces el usuario final no puede distinguir entre un valor nulo y uno falso (para el tipo de datos booleano). Esencialmente, si está usando casillas de verificación para controlar sus booleanos, omita el nulo. Si necesita el tri-estado (nulo, verdadero, falso), usará algún tipo de menú desplegable o una casilla de verificación elegante que indica específicamente la ausencia de un valor. – tggm

6

puede extender HtmlHelper para bool.

y recuerde que debe usar la dirección del espacio de nombres YesNoExtensions en la página de afeitar. rem: podemos sobrecargar DisplayFor for boolean con el signo de cambio de función.

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

y página de afeitar.

<%@ import namespace='SampleExtensions' %> 


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

último parámetro verdadero es ficticio para seleccionar a la derecha Mostrar para el que hemos sobrecargado. Espero útil.

+0

¿no puedo crear una nueva plantilla de visualización en compartida y pasar un valor de cadena? –

+0

sí, puedes hacerlo. recuerde, para dar el nombre de la plantilla para DisplayFor. funcionará. –

12

¿Qué tal esta simple cosa:

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

Ésta es una entrada antigua, pero yo estaba teniendo problemas para encontrar una respuesta actual.

En realidad hay un método @HTML en MVC 5, @Html.Display**Text**For(model => model.SomeBoolean).