母版页在引用自己的属性和成员时不会编译

Master page won't compile when referencing its own properties and members

将基于 asp.net WebForms 的 dotnet 网站 升级到 Web 应用程序 时,我遇到了 Master 问题页。

我的母版页在其 .aspx 文件标记中包含如下引用:

<div>
   Name: <% =GetUserName() %>  Account: <% =AccountId %>
</div>

GetUserName() 是在我的母版页的代码隐藏文件中定义的受保护方法,AccountId 是同一位置的受保护字段。

完成 Web 应用程序升级后(涉及自动生成 Site.Master.designer.cs 代码隐藏文件以伴随我自己的 Site.Master.cs 代码隐藏文件)母版页(不是代码隐藏)的编译开始失败,拒绝 <% =GetUserName() %> 结构中受保护的成员引用。 VS 2015 Intellisense 说 GetUserName not defined in this context.

但是 VS2015 上下文菜单中的 Go To Definition... 项仍然适用于违规的受保护成员引用。奇怪。

当我从头开始创建一个新的Web App 项目时,它没有出现这个问题。我怎样才能解决这个问题?还是升级后的网站项目有什么特别之处可以防止这些受保护的成员引用?

我想通了。

项目的顺序在 project.csproj 中很重要,从网站到 Web 应用程序的转换并不总是正确的。

要修复,请关闭 VS2015,然后使用文本编辑器打开 project.csproj 文件。 (它将以您的项目命名。)为您的母版页的代码隐藏文件寻找 <Compile...> 标签。

然后确保用于编译您自己的代码隐藏文件的标签位于 之前 .designer.cs 代码的标签,如下所示:

<Compile Include="Site.Master.cs">
  <DependentUpon>Site.Master</DependentUpon>
  <SubType>ASPXCodeBehind</SubType>
</Compile>
<Compile Include="Site.Master.designer.cs">
  <DependentUpon>Site.Master</DependentUpon>
</Compile>

根据我的经验,这些标签在自动生成的 .csproj 文件中被广泛分离。

无论如何,移动其中一个使它们按顺序排列解决了我的问题。

如果您在 IDE.

之外更改 .csproj 文件,请不要忘记在 VS2015 中清理并重建您的项目