2012-02-16 32 views
1

我有一個視圖模型類:參照容器中DisplayTemplate

public class OrderLine { 
    public string CurrencyCode { get; set; } 
    public decimal PriceExVat { get; set; } 
    public decimal PriceIncVat { get; set; } 
} 

我已定義的自定義DisplayTemplate Currency.cshtml到格式貨幣。

@Html.DisplayFor(m => m.PriceExVat, "Currency") 
@Html.DisplayFor(m => m.PriceIncVat, "Currency") 

Currency.cshtml

@model decimal? 
@Model.ToString() // here I need a reference to container to get the CurrencyCode 

我知道我可以使用additionalViewData對容器對象的引用傳遞到顯示模板:

@Html.DisplayFor(m => m.PriceIncVat, "Currency", new { conatiner = Model }) 

我只是想知道,如果它是已經在模板中可用。從ModelMetadata我只能得到ContainerType。

感謝

回答

1

對於這個你最好的選擇是創建一個自定義類:

public class Currency { 
    public decimal Amount { get; set; } 
    public string CurrencyCode { get; set; } 
} 

然後爲OrderLine

public class OrderLine { 
    public Currency PriceExVat { get; set; } 
    public Currency PriceIncVat { get; set; } 
} 

在你DisplayFor叫你可以刪除多餘的PARAM,因爲它將使用類型名稱:

@Html.DisplayFor(m => m.PriceExVat 

然後在currency.cshtmlDisplayTemplates文件夾:

@model Currency 
@(CurrencyCode): @Amount 

類似的東西會給你想要的東西,我相信。

+0

只需要注意一點,'Currency'可能最適合作爲'struct',因此它的功能類似於標準的'decimal',不確定您是否可以將'CurrencyCode'修改爲'enum'或其他東西可以有一個默認值。 – 2012-02-16 14:33:47

+0

謝謝保羅。我嘗試了類似的方式,通過使用CLR的Money Type(在Codeplex上找到它)。但是,編寫和維護代碼變得更加複雜。我不得不使用各地的構造函數來初始化結構,嘗試用不同的貨幣添加值時出現異常等。我想我只是使用additionalViewData將容器引用傳遞到DisplayTemplate中。 – Corneliu 2012-02-16 15:51:36

+0

是的,不幸的是,除非父母碰巧實際上是一個動作,否則不會訪問父上下文,當模板被調用時,'ViewData'(和'Model')實例將被重建,所以這是您唯一的選擇。 – 2012-02-16 16:10:11