8

ho trovato questo post su Display e EditorTemplates per MVC:formattazione valuta utilizzando modello di visualizzazione in MVC

http://www.growingwiththeweb.com/2012/12/aspnet-mvc-display-and-editor-templates.html

Si crea un modello di visualizzazione per visualizzare facilmente un decimale formattato con il segno di valuta.

Il modello utilizzato nell'esempio:

public class TestModel 
{ 
    public decimal Money { get; set; } 
} 

La maschera di visualizzazione:

Vista/Shared/DisplayTemplates/decimal.cshtml:

@model decimal 

@{ 
    IFormatProvider formatProvider = 
     new System.Globalization.CultureInfo("en-US"); 
    <span class="currency">@Model.ToString("C", formatProvider)</span> 
} 

Nel mio sito ho un aiutante classe con un metodo per recuperare una stringa di valuta formattata da un decimale, quindi vorrei sostituire il precedente con qualcosa del tipo:

@model decimal 
@(MyHelperClass.GetCurrencyString(Model)) 

E infine la vista in cui vogliamo vedere la valuta formattato:

@model TestModel  
@Html.DisplayFor(e => e.Money) 

uscita:

<span class="currency">$3.50</span> 

posso realizzare questo senza alcun problema. Ma ovviamente ho punti di vista diversi in cui voglio visualizzare una valuta formattata. Ma in alcuni casi non voglio mostrare il segno di valuta.

La mia domanda ora è come dovrei implementare questa piccola variazione senza troppo esagerare nel codice.

Ecco il mio attuale implementazione:

ho cambiato template di visualizzazione per questo:

@model decimal 

@{ 
    bool woCurrency = (bool)ViewData["woCurrency"]; 
} 

@(MyHelperClass.GetCurrencyString(Model)Model,woCurrency)) 

Naturalmente ho anche cambiato il metodo GetCurrencyString ad accettare questo attributo aggiuntivo.

A mio parere ora devo fornire questo attributo anche:

@Html.DisplayFor(m => m.Money, new { woCurrency = true }) 

Quindi, in realtà ho tutto funziona come dovrebbe funzionare. Ma in qualche modo non mi piace questa soluzione che rende la vista più complessa.

La mia domanda: esiste un altro metodo per implementare qualcosa di simile? O qualche consiglio per ottimizzare la mia attuale sollution?

Grazie!

risposta

2

Come su HtmlHelper che controlla il ViewData["woCurrency"] automaticamente ed emette il risultato corretto?

public static string Currency(this HtmlHelper helper, decimal data, string locale = "en-US", bool woCurrency = false) 
    { 
     var culture = new System.Globalization.CultureInfo(locale); 

     if (woCurrency || (helper.ViewData["woCurrency"] != null && (bool)helper.ViewData["woCurrency"])) 
      return data.ToString(culture); 

     return data.ToString("C", culture); 
    } 

Poi:

@Html.Currency(Model.Money); 
+0

Grazie per il suggerimento. Questo significa che ho sempre bisogno di impostare la proprietà nei viewdata nella vista? Dal momento che ho i prezzi multipli che voglio mostrare in una vista, ma non tutti dovrebbero mostrare un segno di valuta. Quando ho iniziato a leggere i modelli di display ho pensato che avrebbero reso tutto molto più semplice e pulito, ma sembra che mi abbiano ingannato :( – ThdK

+0

Puoi anche impostare 'ViewData' nel' controller'. – haim770

+0

Sì lo so, ma poi avrebbe lo stesso valore per ogni valuta che voglio formattare sulla vista corrente.Ho un viewmodel che rappresenta una linea nel carrello.Una delle proprietà è un prezzo decimale.Per la maggior parte delle linee non voglio un segno di valuta, per subtotale e linee totali, voglio mostrare il segno di valuta.Tuttavia, entrambe le linee usano lo stesso oggetto (viewmodel) per memorizzare i loro valori. – ThdK

17

È necessario applicare attributo DisplayFormat alla proprietà Money.Per esempio:

[DisplayFormat(DataFormatString = "{0:C}")] 
public decimal Money { get; set; } 

Per ulteriori informazioni un'occhiata a questi due link:

  1. DisplayFormatAttribute.DataFormatString (L'esempio nella parte inferiore della pagina utilizza moneta formattazione come esempio)
  2. ASP.NET MVC - DisplayFormat attribute
+0

Purtroppo, abbiamo alcune regole personalizzate per formattare la stringa di valuta ... Questo sarebbe anche effettuare il rendering di mia valuta su ogni luogo è usato mentre voglio solo fare due diverse implementazioni. – ThdK

Problemi correlati