如何强制Visual Studio重新生成aspx/ascx文件的.designer文件?

430
有时,当我编辑页面或控件时,.designer文件停止更新新加入的控件信息。我不确定是何原因导致此问题发生,但我想知道是否有任何方法可以强制Visual Studio重新生成.designer文件。我正在使用Visual Studio 2008。
编辑:抱歉,我应该指出我已经尝试过:
关闭和重新打开所有文件和Visual Studio 对页面上的runat="server"控件进行更改 删除并重新添加页面指令

62
2012年了,Visual Studio居然还没有一个从源文件重新生成设计器文件的上下文菜单项,这难道不荒谬吗?这就像不能重新构建损坏的DLL一样。我不理解...特别是在使用外部源代码控制和编辑器时,你会发现Visual Studio非常无力。如果你问我的话,这就是浪费金钱。我正在尝试重新生成资源文件设计器,虽然我设法实现了它的重新生成,但这只是通过一些不为人知的方法...啊!!!1 - bambams
4
如果我能从每个像这样的奇怪“功能”中获得一分钱,我比比尔·盖茨还要富有。如果你认为这还不够坏,请看看Outlook Express存储其邮件数据的位置。它深藏在用户文件夹中一个神秘的文件夹名称下面,默认情况下被隐藏。 - ATL_DEV
15
有没有针对VS 2015的解决方案? - Anton
3
不是永久性的解决方案,但这可以恢复.cs文件中的控件引用:1. 打开相关的.aspx文件;2. 删除<%@ Page指令行末尾的单个">";3. 等待一两秒钟;4. 把">"放回去。5. 切换到.cs文件,你会发现它现在没有控件引用错误了。我已经这样做很长时间了,在每个VS版本中都有效。 - ingredient_15939
1
@ingredient_15939,VS2019和你的评论对我很有帮助。非常感谢! - abhi
显示剩余2条评论
49个回答

387

如果你打开.aspx文件并在设计视图和HTML视图之间切换,然后返回,它会提示VS检查控件并添加任何缺失的控件到设计器文件中。

在VS2013-15中,在项目菜单下有一个转换为Web应用程序命令。在VS2013之前,此选项在as(c/p)x文件的右键上下文菜单中可用。执行此操作后,您应该会看到现在有一个*.Designer.cs文件可用,并且设计HTML中的控件将可用于您的控件。

注意:不应在调试模式下执行此操作,因为在调试过程中并非所有内容都会“重新编译”。

有些人报告说通过(备份.designer.cs文件然后)删除.designer.cs文件也可以成功。您需要用相同名称创建一个空文件。

这个答案有许多评论,补充了如何最好地重新创建designer.cs文件的技巧。


11
我发现将调试模式改为发布模式对我起了作用,谢谢。 - Chris
5
只是想说我遇到了相同的错误,并尝试了这个页面上的所有方法,但都没有起作用。最终发现一个具有runat="server"属性的div标签缺少一个">"闭合符号。我使用的是VS-2008。 - Ber53rker
10
要使“转换为 Web 应用程序”选项出现,首先需要通过在“解决方案资源管理器”中右键单击 aspx 文件并选择删除来删除 Designer.cs 文件。在 VS 2010 中,这对我有效。 - DeveloperDan
1
更糟糕的是,在VS2013中,“转换为Web应用程序”的选项已经消失。请参见:https://connect.microsoft.com/VisualStudio/feedback/details/806283/regenerate-the-designer-file-filename-aspx-designer-cs-in-visual-studio-2013# - JohnnyBizzle
45
在项目菜单下,VS2013有“转换为Web应用程序”的选项,只是不再在上下文菜单中。 - Dennis Burton
显示剩余13条评论

103

我找到了一个可行的解决方案,虽然我并不是很喜欢它。我不得不删除.designer.cs文件,然后重新创建一个同名的空文件。当我再次保存aspx文件时,设计师文件被重新生成。

靠谱吗!


4
这对我也起作用了。不是很理想。不知道为什么原始设计文件停止正确更新了。 - Iain Holder
3
这对我没用。现在我有一个空文件,所有相关的代码都不起作用了!!!正在重新启动... - DiningPhilanderer
7
这对我有用。我确保删除原始文件,使用相同的名称创建一个新的 designer.cs 文件,关闭新文件,稍微修改 .as(p/c)x 文件以强制保存,然后一切都很好。 - TJB
9
如果出现视图编译错误,它不会自动恢复。通常情况下这就是为什么它一开始就停止重新生成的原因。您需要打开视图编译才能看到它,这并不是直接的过程。 - DevelopingChris
1
我还必须在我的项目中包含空文件。 - JP Hellemons
显示剩余6条评论

88
我使用的方法每次都有效:
  • 选择aspx/ascx文件编辑器中所有代码前段(html标记等)。
  • 剪切。
  • 保存。
  • 粘贴。
  • 保存。

重新编译。


3
我认为只需删除一个控件并重新添加它即可达到相同的效果。 - chris
我做了这个并且它对我起作用了。然而,我不得不创建一个名为<name>.aspx.designer.vb的空文件才能让它工作。 - Tahir Hassan

66

最近我发现自己遇到了同样的问题。Visual Studio 2010 拒绝更新设计器文件。

事实证明,如果一个页面使用 CodeFile(运行时编译)而不是 CodeBehind(DLL),VS 就不会修改设计器文件。无论你多少次关闭 VS、重新加载项目、重新创建控件或者修改文件,在 CodeFile 页面上什么都不会促使 VS 重新生成设计器文件。似乎它不会为 CodeFile 页面创建设计器文件,但要求它存在。

我将其更改为 CodeBehind 并保存该页面。设计器文件立即更新。然后我再把它改回去,一切都还好。这种行为似乎是 VS 2010 / .NET 4.0 中新增的,因为默认情况下,VS 2008 不会出现这种问题。

就是这部分:

<%@ Page Language="vb" AutoEventWireup="false" CodeFile="YourPage.aspx.vb" Inherits="YourPageClass" %>

将CodeFile改为CodeBehind,保存,然后撤销更改。


来晚了。以上回答中没有一个描述如何强制在*.aspx.designer.cs文件中列出控件。我希望这个方法可以,但它仍然不能强制在*.aspx.designer.cs文件中声明控件。我正在使用VS 2010 Pro SP1。我试图让它与IDE在/Account中生成的任何默认文件一起工作,比如ChangePassword.aspx。谢谢。 - paparush
1
我的设置是 CodeFile,我改成了 CodeBehind,保存后又改回 CodeFile,保存,一切都很顺利。之前尝试的修复方法对我没用。使用的是VS 2010 Pro。 - Daniel Bragg

39

还有一种可能性: 你的.aspx文件中可能存在错误,这将导致Visual Studio无法重新生成设计工具。

如果您切换到设计视图,它会显示控件无法呈现。修复控件(在我的情况下,是属性中多余的引号)并重新编译应该可以重新生成设计工具。


我曾经遇到过同样的问题,用户控件出现了错误,因此使用该用户控件的页面也因用户控件中的错误而出现了不相关的错误。 - Ronen Festinger
1
同样的原因。我在一个 ASP 按钮上添加了一个不支持的属性 visible="false"。我将其删除后,设计师代码被重新生成。 - chingNotCHing

23
大多数这里的解决方案都无法在运行Visual Studio 2013和可能的2012时生效。微软可能引入了一些优化,使IDE更加快速,因此他们减少了触发代码生成器的情况。以下曾经起作用但现在不再起作用的场景包括:
  1. 删除aspx或ascx文件——不再检查此情况
  2. 剪切所有内容并重新粘贴到aspx或ascx文件中——不再起作用,引用没有变化
  3. 转换为Web应用程序——选项不再可用
  4. 任意更改aspx/ascx文件上的内容——不再起作用(参见2)。
解决方案非常简单,但略微麻烦。为了触发代码生成器,请更改某些需要生成designer.aspx.cs的内容。更改不影响代码的内容,例如CSS样式或添加文本,不会触发代码生成器。您必须更改一个已引用的控件。以下是如何操作:
在ascx或aspx中更改控件的ID。
<asp:HyperLink ID="MyLink" runat="server" NavigateUrl="~/Default.aspx" Text="Home" />

to

<asp:HyperLink ID="theLINK" runat="server" NavigateUrl="~/Default.aspx" CssClass="tab" Text="Home" />

转换为中文:请前往ascx.cs或aspx.cs文件,并确保将所有对“MyLink”的引用重命名为“theLINK”。保存并构建,然后就可以使用了。

关于Visual Studio新版本中的更改,这是一个非常好的观点。与上面混淆ID不同的是,对我有用的是清除设计文件,然后添加一个全新的、无害的控件,例如<asp:PlaceHolder ID="Foo" runat="server/>,然后保存以触发重新生成。即使您忘记删除它,也不会受到任何影响。 - Jordan Rieger
10
如果选择了适当的文件,'转换为Web应用程序'选项将在“项目”菜单中提供。 - WynandB
3
哎呀,如果已经是一个 Web 应用程序,那么这个选项就不可用了。 - ATL_DEV
一个快速的更改是编辑Inherits=属性的命名空间部分。这应该会编辑.designer文件中的命名空间并重新生成其中的所有内容。我刚刚在VS2013.3中尝试了这个方法。 - David Russell
嗨,我通常会尝试使用您提供的方法,但问题在于另一个用户无法生成g.cs文件,而只有管理员能够这样做。 我们正在使用TFS,在VS中使用多个开发人员用户ID,我们能够生成g.cs。 在服务器、TFS和SP上生成g.cs所需的权限是什么? - nirav
@WynandB,你的解决方案对我很有用。如果有人在菜单中找不到该选项,请先删除设计文件再查找。 - Bryan Rayner

16

我知道的唯一方法是删除设计文件,然后将其转换为Web应用程序。 但是当你这样做时,通常会弹出一个错误提示,说明为什么它没有自动重新生成,这通常是因为页面头部中没有声明控件引用。


抱歉,它没有起作用,在我开始使用它以来,它在VS 2008中一直有效。你的页面是否存在语法错误?你应该会得到一个对话框,告诉你需要修复什么才能使它正常工作。 - DevelopingChris
这对我有用。代码后台类有一个int Id属性,在C#中编译得很好,因为它是区分大小写的。但是aspx页面中的ID="ControlName"试图执行Id = "ControlName"转换为Web应用程序会显示类似于ControlName无法转换为Int32的消息。 - Nelson Rothermel

10

将其转换为Web应用程序对我没有起作用。

删除 designer.cs 并粘贴一个空白的 designer.cs 也无效。

但是,这个方法有效:

  1. 选择所有内容(Default.aspx)
  2. 剪切
  3. 保存 Default.aspx
  4. 粘贴
  5. 保存 Default.aspx

完成。新的 designer.cs 已生成。 :)


我可以确认这在VS2013中可行,我刚刚做了它并解决了我的问题。 - ToastyMallows
你.一定.在.开.玩.笑.吧。这个方法在我使用VS2015时有效,而选择答案中的转换却无效。 - GraehamF

6
我经常发现复制和粘贴引起了这种行为。大多数情况可以通过编辑服务器控件的ID来解决(只需添加一个字符,然后删除它)。
还要记住,像Repeater之类的控件内部并不在设计文件中可见。
当然,有些情况下你需要使用上面列出的删除文件的方法 - 但更改名称的解决方案大多数情况下都有效。

2
这是我经常遇到的错误类型。如果你从一个页面复制HTML到另一个页面,并且有带有runat="server"属性的控件,那么这些控件的名称将被重命名以避免冲突。然而,如果你将它们粘贴在“html注释”标签<!-- whaterver -->中,控件ID将不会改变,任何冲突都会阻止设计文件重新生成,因为存在两个具有相同ID的控件。这是因为在html“注释”标签内部也创建了控件。 ;) - tomasofen

5
我找到了一种解决这个问题的方法,而且不需要更改任何代码或运行“转换为Web应用程序”之类的命令 - 而且这种方法也很简单!我发现重新启动Visual Studio通常可以解决该问题,但有时并不总是有效。在这些情况下,如果您在关闭Visual Studio之后删除Web项目中“obj”目录中的所有内容,然后再次打开它,对我来说总是有效的。(重新启动后,您只需添加一个空格,然后再次删除它,然后点击保存以使设计文件得到正确重建)

我一直在负责支持一个遗留应用程序,最近遇到了问题。感谢您指出这个问题。我没有权限将其转换为Web应用程序、创建新的解决方案或做任何事情,只能修复错误。对于我来说,设计师经常会崩溃。但是这些提示至少有所帮助。 - Jamie Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接