2011-01-06 22 views
6

propiedad:html helpers para tipo 'decimal' y formato?

public decimal Cost { get; set; }

HTML helper:

<%: Html.TextBoxFor(m => m.Cost)%>

Pregunta: cuando estoy estableciendo la propiedad Cost, ¿cómo puedo darle formato? por ejemplo, ¿muestra una precisión de dos decimales?

Respuesta

10

Se podría definir su propio método de extensión, algo así como:

public static MvcHtmlString DecimalBoxFor<TEntity>(
      this HtmlHelper helper, 
      TEntity model, 
      Expression<Func<TEntity, Decimal?>> property, 
      string formatString) 
     { 
      decimal? dec = property.Compile().Invoke(model); 

      // Here you can format value as you wish 
      var value = !string.IsNullOrEmpty(formatString) ? 
           dec.Value.ToString(formatString) 
          : dec.Value.ToString(); 
      var name = ExpressionParseHelper.GetPropertyPath(property); 

      return helper.TextBox(name, value); 
     } 

Y a continuación, el uso sería:

<%Html.DecimalBoxFor(Model,m => m.Cost,"0.00")%> 
+1

Thanks. Esto parece más trabajo de lo que esperaba, así que no voy a ir con esto en este momento. Lo mantendré para futuras referencias. En una nota relacionada, ¿es esto lo que tienes que hacer cuando tus tipos no son cadenas simples, especialmente si son numéricas? Pensarías que tiene que haber una solución más simple, ¿no? – VoodooChild

+1

:) gracias por el estímulo !!! – VoodooChild

+3

cuando podemos simplemente 'decimal.ToString (" N2 ")' para formatear un decimal en dos lugares 12 líneas un código * es un poco mucho * en comparación. El hecho es que los helpers/extensiones de HTML incorporados deberían tener una sobrecarga para formatear los resultados. –

0

no creo que hay una manera de hacerlo utilizando el asistente de HTML, sin embargo, puede enviar el valor para el cuadro de texto preformateado con la precisión decimal 2.

10

Recomiendo DisplayFor/EditorFor plantilla helper.

// model class 
public class CostModel { 
    [DisplayFormat(DataFormatString = "{0:0.00}")] 
    public decimal Cost {get;set;} 
} 

// action method 
public ActionResult Cost(){ 
    return View(new CostModel{ Cost=12.3456}) 
} 

// Cost view cshtml 
@model CostModel 

<div>@Html.DisplayFor(m=>m.Cost)</div> 
<div>@Html.EditorFor(m=>m.Cost)</div> 

// rendering html 
<div>12.34</div> 
<div><input class="text-box single-line" id="Cost" name="Cost" type="text" value="12.34" /></div> 

Hope this help.

0

Si no es necesario utilizar el método For, simplemente puede hacerlo así.

<%: Html.TextBox("Cost", Model.Cost.ToString("N2")) %> 
14

he pellizcado respuesta de Jamiec por encima de un poco de (a) que se compile y (b) utilizar los mismos métodos subyacentes como marco hace:

public static MvcHtmlString DecimalBoxFor<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, decimal?>> expression, string format, object htmlAttributes = null) 
{ 
    var name = ExpressionHelper.GetExpressionText(expression); 

    decimal? dec = expression.Compile().Invoke(html.ViewData.Model); 

    // Here you can format value as you wish 
    var value = dec.HasValue ? (!string.IsNullOrEmpty(format) ? dec.Value.ToString(format) : dec.Value.ToString()) 
       : ""; 

    return html.TextBox(name, value, htmlAttributes); 
} 
+0

¿Dónde está el código para ExpressionHelper? –

+0

@GaryWoodfine está en System.Web.Mvc. – Gaz

+0

Lo encontré poco después de mi publicación. Usé el código provisto que ha demostrado ser extremadamente útil. Gracias –

3

La solución al problema descrito es muy sencillo: sólo hay que aplicar el siguiente atributo a su propiedad clase del modelo abordado:

[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:0.00}")] 
public decimal Cost { get; set; } 

Dónde DataFormatString describe el formato de pantalla deseado y elLa banderaindica que también desea aplicar este formato en modo editable (y no solo en modo de solo lectura, que es el caso si omite esto).

(Ver también DisplayFormatAttribute Class)

+0

Gracias por su respuesta. Me ayuda. –