在Asp.net MVC视图中看不到可移植类库中的扩展方法

时间:2015-08-12 06:51:17

标签: c# asp.net asp.net-mvc razor

这是我的问题:

我们创建了一个包含CommonColors类的可移植类库,它包含一个颜色列表,我们所有客户端软件都可以将其用作产品的常用颜色方案。在非可移植类库中定义颜色之前它们工作正常,但现在无法在Web客户端视图中访问它们。其他地方(Asp.Net代码隐藏,WPF)他们工作正常。

客户端包括一个带有剃刀视图的Asp.Net Web客户端,一个WPF客户端,并且会有某种类型的移动客户端。

我们在运行时得到的错误是:“CS1061:'string'不包含'ToHtmlColorValue'的定义,并且没有扩展方法'ToHtmlColorValue'接受类型'string'的第一个参数可以找到(你错过了吗?使用指令或汇编引用?)“

程序集引用是正确的,Web项目中有一个对可移植类库的引用。它们在视图中的引用如下:

@{
string bgcolor = "#" + MySpace.Common.CommonColors.MyTestColor.ToHtmlColorValue();
}
<div id="testdiv" style="background-color:@(bgcolor);">
    &nbsp;
</div>

这是我的便携式类库项目中的颜色类:

namespace MySpace.Common
{
    public static class CommonColors
    {
        private static string FromRgb(int r, int g, int b)
        {
            return r.ToString() + "," + g.ToString() + "," + b.ToString();
        }

        public static string ToHtmlColorValue(this string rgb)
        {
            string result = "000000";
            try
            {
                string[] parts = rgb.Split(',');
                int r = int.Parse(parts[0]);
                int g = int.Parse(parts[1]);
                int b = int.Parse(parts[2]);
                result = r.ToString("x2") + g.ToString("x2") + b.ToString("x2");
            }
            catch
            {
                // do nothing
            }
            return result;
        }

        public static string MyTestColor = FromRgb(100, 165, 0);

        // more colors...
    }
}

我想了解究竟是什么导致了这个问题,并将实现修复为更优雅和更好的代码。目前我们可以在每个使用颜色的视图中添加一行@using MySpace.Common,但这会产生不可靠的代码,需要编码器知道/记住使用该语句,否则在运行时会出现意外错误。

添加using语句会使方法在视图中可见,但在视图中使用相同的命名空间路径引用它不会。为什么呢?

1 个答案:

答案 0 :(得分:1)

删除你的静态变量MyTestColor并让你像这样公开FromRgb:

namespace MySpace.Common
{
    public static class CommonColors
    {
        public static string FromRgb(int r, int g, int b) 
        {
            return r.ToString() + "," + g.ToString() + "," + b.ToString();
        }

        public static string ToHtmlColorValue(this string rgb)
        {
            string result = "000000";
            try
            {
                string[] parts = rgb.Split(',');
                int r = int.Parse(parts[0]);
                int g = int.Parse(parts[1]);
                int b = int.Parse(parts[2]);
                result = r.ToString("x2") + g.ToString("x2") + b.ToString("x2");
            }
            catch
            {
                // do nothing
            }
            return result;
        }
    }
}

这样称呼:

@{
    var rgb = CommonColors.FromRgb(1, 1, 1);
    string bgcolor = "#" + rgb.ToHtmlColorValue();
}

另外,您可以在web.config中添加命名空间,使其在整个视图中都可见,而无需像这样添加命名空间。

<system.web.webPages.razor>
  <pages pageBaseType="System.Web.Mvc.WebViewPage">
    <namespaces>
      <add namespace="MySpace.Common" />
    </namespaces>
  </pages>
</system.web.webPages.razor>