2010-02-01 7 views
5

estoy construyendo una tabla de datos como éstehay una manera para establecer el valor HideSurroundingHtml en ASP.MVC 2

<% foreach (var person in Model.People) 
{ 
%> 
    <tr> 
     <td><%= Html.ActionLink(accessory.Name, "EditPerson") %></td> 
     <td><%= Html.DisplayFor(c => person.Name) %></td> 
     <td><%= Html.DisplayFor(c => person.Age) %></td> 
     <td><%= Html.DisplayFor(c => person.Budget)%></td> 
    </tr> 
<%} %> 

He creado plantillas para anular los valores predeterminados siguientes Brad Wilson's tutorial:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %> 
<script runat="server"> 
    protected override void OnInit(EventArgs e) { 
     base.OnInit(e); 

     if (ViewData.ModelMetadata.HideSurroundingHtml) { 
      TablePlaceholder.Visible = false; 
     } 
     else { 
      Controls.Remove(Data); 
      DataPlaceholder.Controls.Add(Data); 
     } 
    } 
</script> 
<asp:ContentPlaceHolder runat="server" id="Data" /> 
<asp:PlaceHolder runat="server" id="TablePlaceholder"> 
    <table cellpadding="0" cellspacing="0" border="0" width="100%"> 
     <tr> 
      <td style="width: 10em;"> 
       <div class="display-label" style="text-align: right;"> 
        <asp:ContentPlaceHolder runat="server" id="Label"> 
         <%= ViewData.ModelMetadata.GetDisplayName() %> 
        </asp:ContentPlaceHolder> 
       </div> 
      </td> 
      <td> 
       <div class="display-field"> 
        <asp:PlaceHolder runat="server" id="DataPlaceholder" /> 
       </div> 
      </td> 
     </tr> 
    </table> 
</asp:PlaceHolder> 

al representar la tabla no quiero para mostrar el código HTML que rodea, pero no tienen ni idea de cómo establecer el valor HideSurroundingHtml?

Respuesta

3

una forma más limpia y más clara de hacerlo sería así:

public class MyModel 
{ 
    [AdditionalMetadata("HideSurroundingHtml", true)] 
    public string Something { get; set; } 
} 

Y en su opinión:

bool hideSurroundingHtml = (this.ViewData.ModelMetadata.AdditionalValues.ContainsKey("HideSurroundingHtml") ? (bool)this.ViewData.ModelMetadata.AdditionalValues["HideSurroundingHtml"] : false); 

if (!hideSurroundingHtml) 
{ 
    @:<div> 
} 

//Content. 

if (!hideSurroundingHtml) 
{ 
    @:</div> 
} 
+0

Me gusta esta solución. – adriaanp

+0

Gracias, todavía no estoy loco por lo torpe que resulta el HTML con todas las declaraciones 'if' que necesitaría, pero creo que es una forma bastante directa de hacerlo. –

+0

Tenga en cuenta que esta técnica crea y accede a una entrada en el diccionario 'AdditionalValues' y en realidad no establece el indicador' HideSurroundingHtml' en 'ModelMetadata'; Intuitivamente, la bandera sigue siendo falsa. – Suncat2000

10

De acuerdo con la MSDN page on ModelMetadata.HideSurroundingHtml Property:

Cuando esta propiedad se utiliza con el DataAnnotationsModelMetadataProvider proveedor de metadatos modelo, se establece en cierto cuando el atributo HiddenInputAttribute es cierto y la propiedad DisplayValue se establece a falso.

por lo que necesita para decorar su propiedad en su modelo con esto:

[HiddenInput(DisplayValue = false)] 

I no tiene ningún sentido para mí, pero parece que funciona!

+2

voy a tener que probarlo, pero a partir de presentimiento pienso que se va a renderizar con la plantilla oculta y no con la plantilla que quiero. – adriaanp

+0

@adriaanp Esto podría causar que use la plantilla 'HiddenInput', pero puede anularlo con el atributo' UIHint' en la misma propiedad. – TLS

Cuestiones relacionadas