2011-01-06 16 views

risposta

10

Si potrebbe definire il proprio metodo di estensione, qualcosa di simile:

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

E poi l'utilizzo potrebbe essere:

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

Grazie. Questo sembra più lavoro di quanto speravo, quindi non andrò con questo in questo momento. Lo terrò per riferimenti futuri. Su una nota correlata, è questo che devi fare quando i tuoi tipi non sono stringhe semplici, specialmente se sono numerici? Penseresti che ci debba essere una soluzione più semplice, no? – VoodooChild

+1

:) grazie per l'incoraggiamento !!! – VoodooChild

+3

quando possiamo semplicemente 'decimal.ToString (" N2 ")' per formattare un decimale in due posizioni 12 righe un codice * è un po 'più * in confronto. Il fatto è che gli helper/estensioni HTML incorporati dovrebbero avere un sovraccarico per la formattazione dei risultati. –

0

Io non credo che ci sia un modo per farlo utilizzando l'helper HTML, tuttavia è possibile inviare il valore per la casella di testo preformattata con la precisione di 2 decimali.

10

Raccomando DisplayFor/Editor per l'helper del modello.

// 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> 

Spero che questo aiuto.

0

Se utilizzare il metodo For non è obbligatorio, è sufficiente farlo in questo modo.

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

ho ottimizzato la risposta di Jamiec sopra un po 'di (a) lo rendono compilare e (b) utilizzare gli stessi metodi sottostanti il ​​quadro fa:

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

Dov'è il codice per ExpressionHelper? –

+0

@GaryWoodfine è in System.Web.Mvc. – Gaz

+0

L'ho trovato poco dopo il mio post. Ho usato il codice fornito che si è dimostrato estremamente utile. Grazie –

3

La soluzione al problema descritto è abbastanza semplice: basta applicare la seguente attributo alla vostra proprietà classe del modello indirizzato:

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

Dove DataFormatString descrive il formato di visualizzazione desiderato e il 0.123.indica che si desidera applicare questa formattazione anche in modalità modificabile (e non solo in modalità di sola lettura, che è il caso se si omette questo).

(Vedi anche DisplayFormatAttribute Class)

+0

Grazie per la risposta. Mi aiuta. –