当我使用ASP.NET时,我发现总会遇到意想不到的事情需要永远调试。我认为拥有这些的综合列表对于那些“奇怪的错误”情况非常有用,并且可以扩展我们对平台奇怪性的了解。
所以:回答一下你的“Gotcha”!
我会开始: 在ASP.NET(VB)下,在try / catch块中执行Response.Redirect不会停止执行当前的Response,这可能导致针对同一Session执行两个并发响应。
答案 0 :(得分:21)
不要在页面初始化事件之后动态添加控件,因为它会搞砸视图状态树。
答案 1 :(得分:8)
Viewstate ...如果您正在使用它......如果您不注意它,可能会失控。
答案 2 :(得分:7)
整个生命周期的事情。
并不是说我看到它有什么问题,只是你会惊讶于在理解它之前开始处理大型ASP.Net项目的人数,而不是相反。因此,它变成了一个陷阱。
请注意,我说大型项目:我认为与生命周期达成协议的最佳方法是首先自己开展一些小项目,如果没有那么重要的话你搞砸了。
答案 3 :(得分:6)
自定义控件的生命周期与同名的页面生命周期事件不完全匹配。
答案 4 :(得分:5)
Page_Load在控制处理程序之前运行。因此,您无法在事件处理程序中进行更改,然后在页面加载中使用这些更改。当您在母版页(例如登录控件)中拥有控件时,这将成为一个问题。你可以通过重定向解决问题,但这绝对是一个问题。
答案 5 :(得分:4)
必须跳过箍以将.ClientID属性转换为javascript。
如果生命周期的呈现阶段创建了一个脚本,为每个服务器控件设置一个与自动初始化为clientID值的控件同名的脚本,那就太好了。或者可以通过某种方式轻松触发此操作。
嗯......我敢打赌,我可以通过反思为自己建立一个方法。
答案 6 :(得分:3)
如果您有重音字符,请不要使用记事本编辑您的web.config,它会将其替换为编码错误的字符。虽然它看起来一样。只是你的申请不会运行。
答案 7 :(得分:3)
调试是ASP.Net的一个非常酷的功能,但只要更改app_code文件夹中的某些代码,就会触发重新构建应用程序,导致所有会话丢失。
在调试网站时这会非常烦人,但您可以使用“ StateServer模式”轻松防止这种情况:它只是一个要启动的服务,还有一个要在web.config中更改的行: 参考msdn:http://msdn.microsoft.com/en-us/library/ms178586.aspx
答案 8 :(得分:3)
我今天刚学会了这个:与GridViews和ListViews一起使用的Bind()方法不存在。它实际上隐藏了一些Reflector魔法,将其变成Eval()和某种变量赋值。
这样的结果就像是:
<%# FormatNameHelper(Bind("Name")) %>
看起来完全有效的会失败。有关详细信息,请参阅this blog post。
答案 9 :(得分:2)
对于用户可能需要很长时间的应用程序,您必须担心session timeouts。
您也需要担心大型应用程序的uploading timeouts
Validatiors可能无法始终将您的页面滚动到数据输入错误的场景(因此用户可能永远不会看到它,并且只会想知道为什么提交按钮不起作用)
如果用户输入HTML符号,例如<
,>
(例如,P > 3.14
),或者无意中<br>
复制粘贴到另一个页面,ASP.NET will reject the page并显示错误。
null.ToString()
会产生很大的错误。仔细检查。
Session pool sharing是一场无声无息的灾难
在具有不同环境的计算机上移动应用程序是一种涉及web.config
和许多潜在小时谷歌的偏头痛
如果使用存储过程,ASP.NET和MySQL很容易出现缓存问题
AJAX也可能弄得一团糟:
if(! Page.IsValid) { return ; }
答案 10 :(得分:2)
进行类似转发器的控制,而不了解INamingContainer
。
答案 11 :(得分:2)
如果您在与ASP.Net应用程序相同的虚拟目录中运行经典ASP应用程序,则应用程序上的第一个命中必须位于ASP.Net页面上。这将确保使用正确的上下文配置构建AppPool。如果要命中的第一页是经典ASP页面,则结果可能因应用程序而异。通常,AppPool配置为使用最新的框架。
答案 12 :(得分:1)
当使用没有数据源控件的gridview(即将数据集直接绑定到控件)时,您需要手动实现排序和分页事件,如下所示:
http://ryanolshan.com/technology/gridview-without-datasourcecontrol-datasource/
答案 13 :(得分:1)
Linq:如果您使用的是Linq-To-SQL,则在数据上下文中调用SubmitChanges()
并抛出异常(例如重复键或其他约束违规),违规对象值会保留在您的内存中您正在调试,并且每次您随后致电SubmitChanges()
时都会重新提交。
现在这里是真正的踢球者:即使您在IDE中按下“停止”按钮并重新启动,错误的值仍将保留在内存中 我不明白为什么有人认为这是一个好主意 - 但是系统托盘中弹出的那个小的ASP.NET图标仍然在运行,它似乎可以保存你的对象缓存。如果要刷新内存空间,则必须右键单击该图标并强制关闭它! GOTCHA!
答案 14 :(得分:1)
设计人员仅在构建使用控件的页面时构建控件或时支持自定义控件,但不能同时支持两者。
答案 15 :(得分:0)
不了解框架中现有的和可扩展的功能。经常重做的事情是成员资格,角色,授权,站点地图。然后是控件和相关标签,可以自定义以减轻客户端ID等问题。还有一些简单的事情,比如不知道如何正确使用.config文件将命名空间自动导入到模板中,并且能够在目录的基础上执行此操作。标记表达式等鲜为人知的事情有时也很有价值。当然,与所有框架一样,有一个学习曲线,总是有一些东西是不可取的,但通常情况下,更好地定制和扩展现有框架而不是滚动自己的框架。
答案 16 :(得分:0)
我必须维护的所有代码仍然看起来像是用vb6编写的,显示出对新样式的完全无知。
我说的是CreateObject(),过多&lt; %%&gt;块,和/或代替AndAlso / OrElse,Len()而不是.Length(),s / o匈牙利前缀疣,Dim MyVariable没有类型,函数没有返回类型......我可以继续。
答案 17 :(得分:0)
您无法在应用程序的根文件夹上方引用任何内容。
答案 18 :(得分:0)
不是纯粹的ASP.NET,但是......
我试图使用a)嵌套的SELECT或b)WITH子句并且无法让它工作,但显然更有知识的人(包括我合作的人)告诉我语法很好。 TURNS OUT ......
无法使用OLEDB中的任何一种。
OLEDB query to SQL Server fails
(另外,我在OP中提到的try ... catch'feature'中的response.redirect()位置很棒!很棒的线程!)
答案 19 :(得分:0)
INamingContainer控件内的数据绑定控件不能放在模板化控件(如FormView)中。有关示例,请参阅this bug report。由于INamingContainer控件为其包含的控件创建自己的命名空间,因此使用Bind()的双向数据绑定将无法正常工作。但是当加载值时,一切看起来都会很好(因为它是用Eval()完成的),在你尝试回发它们神秘地看起来没有落在数据库中的值之前不是这样。
这个问题很好地证明了这个问题:AJAX Tabcontainer inside formview not inserting values
答案 20 :(得分:-5)
(VB.NET)如果通过Property的Get访问器将Object发送到带有ByRef关键字的函数,它实际上将尝试使用Property的Set访问器来更新对象。
例如:
UpdateName(ByRef aName as String)
UpdateName(Employee.Name)
将尝试使用Employee的Name属性上的Set更新名称。