8

znalazłem ten post o Wyświetlanie i EditorTemplates dla MVC:formatowanie waluty przy użyciu wyświetlacza szablon w MVC

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

Tworzy szablon wyświetlania łatwo wyświetlać po przecinku sformatowany ze znakiem waluty.

model stosowany w przykładzie:

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

Szablon display:

Views/Shared/DisplayTemplates/decimal.cshtml:

@model decimal 

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

W mojej stronie mam pomocnika klasa z metodą pobierania sformatowanego ciągu znaków walutowych z części dziesiętnej, więc chciałbym zastąpić powyższe czymś takim jak:

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

I wreszcie pogląd gdzie chcemy zobaczyć sformatowaną walutę:

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

wyjściowa:

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

mogę wdrożyć to bez żadnego problemu. Ale oczywiście mam różne poglądy, w których chcę zobaczyć sformatowaną walutę. Ale w niektórych przypadkach nie chcę pokazywać znaku waluty.

Moje pytanie brzmi teraz, jak powinienem wdrożyć tę niewielką odmianę bez zbytniej przesady w kodzie.

Oto moja aktualna realizacja:

Zmieniłem szablon wyświetlania to:

@model decimal 

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

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

Oczywiście Ja również zmienił metody GetCurrencyString zaakceptować ten dodatkowy atrybut.

Moim zdaniem teraz mam dostarczyć ten atrybut też:

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

Tak właściwie, wszystko działa tak jak powinno działać. Ale jakoś nie lubię tego rozwiązania, które sprawia, że ​​widok jest bardziej złożony.

Moje pytanie do Ciebie: Czy istnieje jakaś inna metoda wdrożenia czegoś takiego? Albo jakąś radę, by zoptymalizować moje obecne rozwiązanie?

Dzięki!

Odpowiedz

2

Co powiedzie się na HtmlHelper, która automatycznie sprawdzi numer ViewData["woCurrency"] i wyświetli poprawny wynik?

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

Następnie:

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

Dzięki za sugestię. Czy to oznacza, że ​​zawsze muszę ustawić właściwość w widoku danych w widoku? Ponieważ mam wiele cen, które chcę pokazać w jednym widoku, ale nie wszystkie powinny pokazywać znak waluty. Kiedy zacząłem czytać o szablonach wyświetlania myślałem, że wszystko będzie o wiele łatwiejsze i czystsze, ale wygląda na to, że mnie oszukały :( – ThdK

+0

Możesz również ustawić "ViewData" w "kontroler". – haim770

+0

Tak, wiem, ale potem miałaby tę samą wartość dla każdej waluty, którą chcę sformatować w bieżącym widoku.Mam modeop reprezentujący linię w koszyku.Jedną z właściwości jest cena dziesiętna.Dla większości wierszy nie chcę znaku waluty, dla sumy częściowe i całkowite, chcę wyświetlać znak waluty, jednak obie linie używają tego samego obiektu (viewmodel) do przechowywania ich wartości: – ThdK

17

Musisz zastosować atrybut DisplayFormat do swojej własności Money.Na przykład:

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

Aby uzyskać więcej informacji spojrzeć na te dwa linki:

  1. DisplayFormatAttribute.DataFormatString (Przykład na dole strony używa waluty formatowania jako przykład)
  2. ASP.NET MVC - DisplayFormat attribute
+0

Niestety, mamy pewne zasady niestandardowe sformatować ciąg waluty ... to również efekt renderowania moim waluty na każdym miejscu, jest on stosowany, gdy chcę tylko dokonać dwóch różnych implementacji. – ThdK

Powiązane problemy