2017-04-25 4 views
0

Ich habe viel gesucht. Vielleicht suche ich an den falschen Stellen ...Währungsformat bei Ansichtskomponente fehlgeschlagen - Work Arounds?

Ich habe eine Produktliste und einen Selbstkostenpreis in der Produktliste. Ein Auszug aus dem Modell:

[Display(Name = "Cost Price")] 
    [DataType(DataType.Currency)]  
    public decimal CostPrice { get; set; } 

Ich verwende Datatype auf dieser Ebene und es funktioniert gut.

Dann referenziere ich das Produktmodell aus einem Kitset-Modell. Ein Kitset ist eine Sammlung von Produkten zur Herstellung einer kompletten Lösung. Ein reales Beispiel könnte Reifen, Rad, Radmuttern und Radkappe sein.

public class ProductKitset 
{ 
    public int ProductKitsetID { get; set; } 

    [Display(Name ="Kitset Name")] 
    public int ProductKitsetNameID { get; set; } 

    public decimal Quantity { get; set; } 

    [Display(Name = "Product")] 
    public int ProductID { get; set; } 

    public Product Product { get; set; } 

    public ProductKitsetName ProductKitsetName { get; set; } 
} 

Dann, wie manche Leute wollen Anführungszeichen und Zitate ein oder mehrere Kitset kann, habe ich ein drittes Modell QuoteToKitset:

public class QuoteToKitset 
{ 
    public int QuoteToKitsetID { get; set; } 

    public int QuoteID { get; set; } 

    public int ProductKitsetID { get; set; } 

    public Quote Quote { get; set; } 

    public ProductKitset ProductKitset { get; set; } 
} 

Am Ende dieser Kette ich ein ViewComponent dann haben. Die ViewComponent gibt die Liste der im Kit enthaltenen Produkte im Angebot zurück. Der Zweck besteht darin, dass die Person, die das Angebot vorbereitet, sehen kann, was im Kitset enthalten ist, falls sie ein anderes Element hinzufügen müssen. Zurück zu unserem Radbeispiel wäre vielleicht auch ein Scheibenbremsrotor erforderlich.

Das funktioniert so gut wie es geht und gibt die Ergebnisse zurück, die ich möchte. Für Vollständigkeit der viewComponent:

public class ProductKitsetsViewComponent : ViewComponent 
{ 
    private readonly Eva804Context _context; 

    public ProductKitsetsViewComponent(Eva804Context context) 
    { 
     _context = context; 
    } 

    public IViewComponentResult Invoke(int id) 
    { 
     var productKitset = from p in _context.ProductKitset 
        .Include(p=>p.Product) 
        .Where(p => p.ProductKitsetNameID == id)      
        select p; 

     return View(productKitset); 
    } 

} 

dann in der Standardansicht für die ViewComponent ich habe:

@foreach (var p in Model) 
    { 
     <tr> 
      <td> 

       @p.Product.ProductCode 
      </td> 
      <td> 

       @p.Quantity 
      </td> 
      <td> 
       @p.Product.ProductDescription.Substring(0, Math.Min(p.Product.ProductDescription.Length, 38)) 
      </td> 

      <td> 

       @p.Product.CostPrice 
      </td> 

Dies funktioniert gut wie ich sagte. Bis auf die Formatierung auf Cost Price. Während ich dies lese und ich immer noch meinen Weg in diese komplexe Welt lerne, wird die Kostenpreisformatierung durch den DataType im Produktmodell festgelegt.

In der realen Welt wird das Format nicht in der ViewComponent reproduziert.

Warum wird der Datentyp ignoriert? Wie kann ich das beheben? Ist etwas falsch in meinem Denken, wo ich verpasst habe, wie hier etwas funktioniert?

+0

Welches Format erhalten Sie? Was ist die Ausgabe? –

+0

Sorry hat diesen Kommentar nicht bemerkt. Ich bekomme einfach das native Dezimalformat ohne Formatierung. Ich bin mir nicht sicher, warum das passiert, aber das unten repariert es. – BitLost

Antwort

0

Es gibt ein paar Möglichkeiten, dies zu tun.

@p.Product.CostPrice.ToString("C") 

wo das Format C geht für Currency. Wenn Sie das Format (Dollar, Euro, Pfund ...) angeben möchten, können Sie sich auf this beziehen.

Eine andere Möglichkeit ist es, das DisplayFormat Attribut angeben:

[DisplayFormat(DataFormatString = "{0:C}")] 

oder

[DisplayFormat(DataFormatString = "${0:#,###0.00}")] 

nach this SO question.

+0

@ p.Product.CostPrice.ToString ("C") funktioniert. Für Interesse habe ich versucht, das DisplayFormat im Modell, aber dies schlägt fehl, wenn durch diesen Prozess an die ViewComponent übergeben. – BitLost