我有一个MVC用户控件,其基本结构如下:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Decimal>" %>
<%= Math.Round(Model) %>
使用时会出现此错误消息:
编译器错误消息:CS0452: 类型'decimal'必须是引用 键入以将其用作参数 泛型类型或方法中的“TModel” 'System.Web.Mvc.ViewUserControl'
有没有办法让这个工作(以某种方式欺骗框架将Decimal作为参考类型处理?)或者我正在尝试做的只是根本错误?
答案 0 :(得分:8)
我建议你在ViewModel中包装值类型。这将在未来允许一些灵活性(可能需要也可能不需要)。
public class MyUserControlViewModel
{
public Decimal MyValue { get; private set; }
public MyUserControlViewModel(Decimal dec)
{
MyValue = dec;
}
}
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyUserControlViewModel>" %>
<%= Math.Round(Model.MyValue) %>
答案 1 :(得分:5)
如果你想要一个快速的方法,不必包装到课堂中,使用这个
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Nullable<Decimal>>" %>
你也可以考虑使用
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
并按代码验证
答案 2 :(得分:3)
ViewUserControl
声明如下:
public class ViewUserControl<TModel> : ViewUserControl
where TModel : class
所以你不能欺骗它用值类型编译。我建议将Decimal
对象包装在另一个类中。
答案 3 :(得分:2)
您可以将值包装在类中:
public class Wrapper
{
public Wrapper(decimal d)
{
this.Value = d;
}
Decimal Value { get; set; }
}
在视图中:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Wrapper>" %>
<%= Math.Round(Model.Value) %>
答案 4 :(得分:1)
模型是从控制器到视图的DTO。您应该使用单个小数属性创建自己的DTO。视图的责任仅在于渲染,Math.Round应由控制器执行。
答案 5 :(得分:0)
我对ASP.Net MVC框架并不十分熟悉,但错误是说你的模型必须是一个类,而不是一个原始类型,从模型视图控制器的角度看它是非常标准的。
要使其发挥作用,您需要一个类:
class MyDouble : Model // or whatever MVC calls it's Model
{
public TheValue {
get;
set;
}
}
然后用<%= Math.Round(Model.TheValue) %>
替换你的行。
注意,只有一个double值的自定义控件似乎是一个奇怪的设计。如果这只是一个示例应用程序,那么很好,但除此之外,您可能想重新考虑如何最好地使用自定义控件。
答案 6 :(得分:0)
虽然我强烈支持上面的所有答案,说明要将一个十进制值包装在一个类中以支持进一步的开发,你可以通过使十进制可为空(“十进制?”)来快速解决问题,因为System.Nullable是一个引用类型