这是我的问题:
我们创建了一个包含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);">
</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语句会使方法在视图中可见,但在视图中使用相同的命名空间路径引用它不会。为什么呢?
答案 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>