如果设置了MasterType,如何使用自动生成的Master属性修复名称空间问题

经过几周的这个问题后,我终于决定要求解决以下问题:

在.aspx页面中,您可以设置

 

这会在.aspx.designer中生成自动生成的属性

 public new Mastername Master { get { return ((Masternamee)(base.Master)); } } 

工作得很好。 但是,如果我在.aspx文件中进行了更改,则该属性将自动生成,并且如下所示:

 public new NAMESPACE1.Mastername Master { get { return ((NAMESPACE1.Mastername)(base.Master)); } } 

之后将无法进行编译,因为无法在给定的命名空间中解析MasterPage的类。 母版页将NAMESPACE1作为命名空间。

每个内容页面都具有相同的NAMESPACE1。 autogenerated属性尝试在NAMESPACE1.NAMESPACE1中查找将失败的母版页类,因为它不存在。 当然我可以删除第一个NAMESPACE1。 使应用程序再次可编辑,但几乎每次我在.aspx文件中进行更改时,这样做很糟糕。

有没有办法避免这个问题? 我能想到的唯一方法是忽略自动生成的属性,并在每次我想访问母版页时进行显式转换。

编辑:我正在使用Visual Studio 2008 Professional SP1。

由于某种原因,设计人员认为母版页在命名空间NAMESPACE1定义,因此请查看母版页定义(以及后面的代码)以检查其名称空间是否未被修改(可能是意外)。

如果没有什么明显的,可能需要在NAMESPACE1所有文件(* .cs,* .aspx,* .master,…)中进行搜索。

(这是使用VCS有用的地方—您可以查看更改的历史记录。)

实际上它更像是一个设计师的“function”。 😉

设计器文件中使用的主名称将从.Master文件的Inherits属性中提取。 因此,更改您对Inherits属性进行限定的方式,这将更改创建设计器文件时使用的类名。

我找到了一个有效的解决方案。 我不会在designerfile中使用autogenerated属性。 我将编写自己的包装器属性,我在每个内容页面中实现。

当我在SOURCE视图<%@ MasterType VirtualPath="~/TestMaster.Master" %>到我的aspx页面时,我遇到了同样的问题。 由于某种原因,页面永远不会正确创建,并一直给我无效的命名空间错误,直到我实际更改为设计视图并调整控件的大小,最后错误消失。 在某个地方它使用了一些缓存数据(即使是构建/清理解决方案也没有清除它),并且在设计者重新创建页面之前,它会生成该错误。

更改

 <%@ MasterType VirtualPath="~/Mastername.master" %> 

 <%@ MasterType TypeName="Mastername" %> 

这将完美地运作