我在 Visual Studio 2008 的 ASP.NET 3.5 Web 应用程序项目中对用户控件(.ascx 文件)进行了一些更改。我注意到我在标记中所做的更改没有反映在设计器文件中(相当众所周知的 问题)。我尝试删除设计器文件并使用“转换为 Web 应用程序”重新生成它。这样做时,我收到了这个错误:
设计器文件生成失败:无法从程序集“System.Web,版本=2.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”加载类型“MyWebApplication.MyCustomExpressionBuilder”。(E:\MyPath\MyWebApplication\Web.config 第 166 行)
我在 .ascx 标记中所做的更改是使用自定义ExpressionBuilder
作为我的 .ascx 中某些控件的Visible
和/或Enabled
属性的值。这个特别ExpressionBuilder
成功地在 Web 应用程序的其他地方使用,以将布尔值返回到类似的属性。例如:
<asp:TableRow runat="server" Visible="<%$ MyCustom: TheExpressionValue %>">
<%-- some TableCells and contents here --%>
</asp:TableRow>
错误消息中指出的 Web.config 行是以下add
标记:
<system.web>
<compilation debug="true">
<!-- Skipping the 'assemblies' and 'buildProviders' areas -->
<expressionBuilders>
<add expressionPrefix="MyCustom" type="MyWebApplication.MyCustomExpressionBuilder" />
</expressionBuilders>
</compilation>
<!-- other stuff -->
</system.web>
该类MyCustomExpressionBuilder
位于名为的目录中的同一个 Web 应用程序项目中Code
(不App_Code
,无论出于何种原因,我不确定如果移动类文件会破坏多少)。
如果必须避免在控件中使用自定义并添加一些属性供调用页面使用,我可以解决此问题ExpressionBuilder
,但这并不理想。请注意,内置表达式(如<%$ Resources: CommonResource, SomeTextString %>
)已经在控件中并且工作正常。
以下是我尝试过的一些事情:
- 只是重建项目。设计器文件未加载,并且由于缺少属性,我在代码隐藏中遇到了很多构建错误。
- 只需更改控件标记,保存并更改控件(在我尝试删除设计器文件之前),确保我没有打开设计器文件。这个过程只是默默地失败了。
- 按照此处的建议,将
ClassName
参数添加到我的<%@ Control %>
指令中。没有效果。 - 添加
<%@ Assembly Name="MyWebApplication" %>
. 没有效果。 - 添加
<%@ Import Namepace="MyWebApplication" %>
. 没有效果。 - 添加
<%@ Reference VirtualPath="~/Code/MyCustomExpressionBuilder.cs" %>
. 没有效果。 - 关闭并重新启动 Visual Studio。第一次尝试在 ascx 上运行“转换为 Web 应用程序”时,至少我得到了一个不同的错误:“抛出了 'System.Exception' 类型的异常。” 在尝试重建项目并得到所有错误后(参见上面的#1),“转换为 Web 应用程序”会产生与以前相同的“生成设计器文件失败”错误消息。
将项目升级到新的 Visual Studio 版本目前不是一个选项。如前所述,我不希望移动自定义ExpressionBuilder
类,因为它至少在 .aspx 文件中工作。我还能尝试什么?