在强类型MVC视图用户控件中使用值类型

时间:2009-05-15 15:30:03

标签: c# asp.net-mvc

我有一个MVC用户控件,其基本结构如下:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Decimal>" %>

<%= Math.Round(Model) %>

使用时会出现此错误消息:

  

编译器错误消息:CS0452:   类型'decimal'必须是引用   键入以将其用作参数   泛型类型或方法中的“TModel”   'System.Web.Mvc.ViewUserControl'

有没有办法让这个工作(以某种方式欺骗框架将Decimal作为参考类型处理?)或者我正在尝试做的只是根本错误?

7 个答案:

答案 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是一个引用类型