Asp.net mvc 对DisplayTemplate中容器的引用
我有一个viewmodel类:Asp.net mvc 对DisplayTemplate中容器的引用,asp.net-mvc,asp.net-mvc-3,razor,Asp.net Mvc,Asp.net Mvc 3,Razor,我有一个viewmodel类: public class OrderLine { public string CurrencyCode { get; set; } public decimal PriceExVat { get; set; } public decimal PriceIncVat { get; set; } } 我已经定义了一个自定义的DisplayTemplate Currency.cshtml来格式化货币 @Html.DisplayFor(m =&g
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
感谢您的帮助,您最好的选择是创建自定义类:
public class Currency {
public decimal Amount { get; set; }
public string CurrencyCode { get; set; }
}
然后对于订单行:
public class OrderLine {
public Currency PriceExVat { get; set; }
public Currency PriceIncVat { get; set; }
}
在DisplayFor
调用中,您可以删除额外的参数,因为它将使用类型名称:
@Html.DisplayFor(m => m.PriceExVat
然后在DisplayTemplates文件夹中的currency.cshtml中:
@model Currency
@(CurrencyCode): @Amount
我相信这样做会满足您的需求。为此,您最好的选择是创建一个自定义类:
public class Currency {
public decimal Amount { get; set; }
public string CurrencyCode { get; set; }
}
然后对于订单行:
public class OrderLine {
public Currency PriceExVat { get; set; }
public Currency PriceIncVat { get; set; }
}
在DisplayFor
调用中,您可以删除额外的参数,因为它将使用类型名称:
@Html.DisplayFor(m => m.PriceExVat
然后在DisplayTemplates文件夹中的currency.cshtml中:
@model Currency
@(CurrencyCode): @Amount
像这样的东西会给你你想要的,我相信。只是一个注释,
Currency
作为一个struct
可能最有效,所以它的功能有点像一个标准的decimal
,不确定是否可以将CurrencyCode
调整为enum
或其他类型,使其具有默认值。谢谢Paul。我也尝试过类似的方法,为CLR使用Money类型(在Codeplex上找到)。但是代码的编写和维护变得越来越复杂。我必须在任何地方使用构造函数来初始化结构,尝试添加不同货币的值时出现异常等。我想我将只使用additionalViewData将容器引用传递到DisplayTemplate。是的,不幸的是,除非父对象实际上是一个动作,否则无法访问父上下文,调用模板时,ViewData
(和Model
)实例将重新生成,因此这是您唯一的其他选项。请注意,Currency
作为struct
可能最有效,因此它的功能类似于标准的十进制
,不确定是否可以将CurrencyCode
调整为enum
或其他类型,使其具有默认值。谢谢Paul。我也尝试过类似的方法,为CLR使用Money类型(在Codeplex上找到)。但是代码的编写和维护变得越来越复杂。我必须在任何地方使用构造函数来初始化结构,尝试添加不同货币的值时出现异常等。我想我将只使用additionalViewData将容器引用传递到DisplayTemplate。是的,不幸的是,除非父对象实际上是一个动作,否则无法访问父上下文,调用模板时会重新生成ViewData
(和Model
)实例,因此这是您唯一的其他选项。