8

ich diesen Beitrag über Anzeigen und EditorTemplates für MVC gefunden:Formatierung Währung Anzeigeschablone in MVC

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

Es hat eine Anzeigevorlage erstellt auf einfache Weise eine Dezimalzahl mit Währungssymbol formatiert angezeigt werden soll.

Das Modell im Beispiel:

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

Die Vorlage Anzeige:

Ansichten/Shared/DisplayTemplates/decimal.cshtml:

@model decimal 

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

In meiner Website habe ich einen Helfer Klasse mit einer Methode, um eine formatierte Währungszeichenfolge von einer Dezimalzahl abzurufen, also würde ich das obige durch etwas wie ersetzen:

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

Und schließlich die Ansicht, in der wir die formatierte Währung sehen möchten:

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

Ausgang:

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

ich dies ohne Probleme umsetzen können. Aber natürlich habe ich verschiedene Ansichten, wo ich eine formatierte Währung sehen möchte. Aber in einigen Fällen möchte ich das Währungszeichen nicht zeigen.

Meine Frage ist jetzt, wie ich diese kleine Variante implementieren sollte, ohne zu viel Code zu übertreiben.

Hier ist meine aktuelle Implementierung:

ich meine Anzeige Vorlage diese geändert haben:

@model decimal 

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

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

Natürlich i auch GetCurrencyString Methode geändert haben dieses zusätzliche Attribut zu akzeptieren.

Aus meiner Sicht muss ich dieses Attribut bieten jetzt auch:

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

Also eigentlich habe ich alles funktioniert, wie es funktionieren sollte. Aber irgendwie mag ich diese Lösung nicht, die den Blick komplexer macht.

Meine Frage an Sie: Gibt es eine andere Methode, um so etwas zu implementieren? Oder irgendeinen Rat zur möglichen Optimierung meiner aktuellen Lösung?

Danke!

Antwort

2

Wie wäre es mit HtmlHelper, die die ViewData["woCurrency"] automatisch überprüft und das richtige Ergebnis ausgibt?

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

Dann:

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

Danke für den Vorschlag. Bedeutet das, dass ich immer die Eigenschaft in den viewdata in der Ansicht festlegen muss? Da ich die mehreren Preise habe, möchte ich in einer Ansicht zeigen, aber nicht alle von ihnen sollten ein Währungszeichen zeigen. Als ich anfing, über Display-Templates zu lesen, dachte ich, sie würden alles viel einfacher und sauberer machen, aber es sieht so aus, als hätten sie mich getäuscht :( – ThdK

+0

Sie können 'ViewData' auch im' Controller' einstellen. – haim770

+0

Ja, ich weiß, aber dann würde den gleichen Wert für jede Währung haben, die ich auf der aktuellen Ansicht formatieren möchte. Ich habe ein viewmodel, das eine Linie im Korb darstellt. Eine der Eigenschaften ist ein dezimaler Preis. Für die meisten Linien will ich kein Währungszeichen, für Zwischensumme und Gesamtzeilen, möchte ich das Währungszeichen zeigen. Jedoch verwenden beide Linien das gleiche Objekt (Viewmodel), um ihre Werte zu speichern. – ThdK

17

Sie müssen das Attribut DisplayFormat auf Ihre Money-Eigenschaft anwenden.Zum Beispiel:

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

Für weitere Informationen haben einen Blick auf diese beiden Links:

  1. DisplayFormatAttribute.DataFormatString (Das Beispiel am unteren Rand der Seite verwendet Währung Formatierung als Beispiel)
  2. ASP.NET MVC - DisplayFormat attribute
+0

Leider haben wir einige benutzerdefinierte Regeln der Währungsstring formatiert werden ... Dies würde auch die Wiedergabe von meiner Währung an jedem Ort bewirken sie verwendet wird, während ich nur wollen mache zwei verschiedene Implementierungen. – ThdK