ASP.NET – 常见问题

当我使用ASP.NET时,我发现总是会遇到意想不到的事情,需要永远调试。 我认为拥有这些的综合列表对于那些“奇怪的错误”情况来说是很好的,加上我们对平台中的奇怪性的了解。

所以:用你的一个“Gotcha”来回答!

我将开始:在ASP.NET(VB)下,在try / catch块中执行Response.Redirect不会停止当前Response的执行,这可能导致针对同一Session执行两个并发响应。

不要在页面初始化事件之后动态添加控件,因为它会搞砸视图状态树。

Viewstate …如果您正在使用它……如果您不注意它,可能会失控。

整个生命周期的事情一般。

并不是说我看到它有什么问题,只是你会惊讶于理解它之前开始从事大型ASP.Net项目的人数,而不是相反。 因此,它变成了陷阱。

请注意,我说大型项目:我认为与生命周期达成协议的最佳方式是首先自己处理一些较小的项目,如果你搞砸它们并不重要。

自定义控件的生命周期与同名的页面生命周期事件不完全匹配。

Page_Load在控制处理程序之前运行。 因此,您无法在事件处理程序中进行更改,然后在页面加载中使用这些更改。 当您在母版页(例如登录控件)中拥有控件时,这将成为一个问题。 您可以通过重定向解决问题,但这肯定是一个难题。

必须跳过篮球才能将.ClientID属性转换为javascript。

如果生命周期的呈现阶段创建了一个脚本,为每个服务器控件设置一个与自动初始化为clientID值的控件同名的脚本,那就太好了。 或者可以通过某种方式轻松触发此操作。

嗯……我敢打赌,我可以通过反思为自己建立一个方法。

如果您有重音符号,请不要使用记事本编辑您的web.config,它将使用错误编码替换它。 它看起来会一样。 只是你的应用程序不会运行。

我今天刚学会了这个:与GridViews和ListViews一起使用的Bind()方法不存在。 它实际上隐藏了一些Reflector魔法,将其变成Eval()和某种变量赋值。

这样的结果就是:

<%# FormatNameHelper(Bind("Name")) %> 

看起来完全有效会失败。 有关详细信息,请参阅此博客文章 。

调试是ASP.Net的一个非常酷的function,但是只要更改app_code文件夹中的某些代码,就会触发重新构建应用程序,导致所有会话丢失。

这在调试网站时会非常烦人,但您可以使用“ StateServer模式 ”轻松防止这种情况:它只是一个启动服务,并且在web.config中需要更改一行:请参阅msdn: http:// msdn。 microsoft.com/en-us/library/ms178586.aspx

  1. InProc模式 ,用于将会话状态存储在Web服务器的内存中。 这是默认值
  2. StateServer模式 ,它将会话状态存储在名为ASP.NET状态服务的单独进程中。 这可确保在重新启动Web应用程序时保留会话状态 ,并使会话状态可用于Web场中的多个Web服务器。
  3. SQL Server ……
  4. 定制……
  5. 关!

如果您在与ASP.Net应用程序相同的虚拟目录中运行经典ASP应用程序,则应用程序上的第一个命中必须位于ASP.Net页面上。 这将确保使用正确的上下文配置构建AppPool。 如果要命中的第一页是经典ASP页面,则结果可能因应用程序而异。 通常,AppPool配置为使用最新的框架。

做一个类似转发器的控件,而不知道INamingContainer

  • 对于用户可能需要很长时间的应用程序,您必须担心会话超时 。

  • 您还必须担心上传大型应用程序的超时

  • Validatiors可能无法始终将您的页面滚动到数据输入错误的场景(因此用户可能永远不会看到它,并且只会想知道为什么提交按钮不起作用)

  • 如果用户输入HTML符号,例如<> (例如, P > 3.14 ),或者从另一页上的复制粘贴中输入无意中的
    , ASP.NET将拒绝该页面并显示错误。

  • null.ToString()会产生很大的错误。 仔细检查。

  • 跨多个应用程序共享会话池是一种无声无息的灾难

  • 在具有不同环境的计算机上移动应用程序是一种偏头痛,涉及web.config和许多潜在的谷歌时间

  • 如果使用存储过程,ASP.NET和MySQL很容易出现缓存问题

  • AJAX也会弄得一团糟:

    • 在某些情况下,客户端可以绕过页面validation(尤其是按ENTER键而不是按下提交按钮)。 您可以通过调用if(! Page.IsValid) { return ; } if(! Page.IsValid) { return ; }
    • ASP按钮通常无法在UpdatePanel内部正常工作
    • UpdatePanel中的内容越多,异步传输的数据就越多,因此加载所需的时间就越长
    • 如果您的AJAX面板出现问题或某种错误,它会“锁定”并且不再响应其中的事件

只有设计人员在构建控件构建使用控件的页面时才支持自定义控件,但不能同时支持两者。

当使用没有数据源控件的gridview(即将数据集直接绑定到控件)时,您需要手动实现排序和分页事件,如下所示:

http://ryanolshan.com/technology/gridview-without-datasourcecontrol-datasource/

Linq:如果您使用的是Linq-To-SQL,则在数据上下文中调用SubmitChanges()并抛出exception(例如重复键或其他约束违规),在调试时,有问题的对象值仍保留在内存中,并且每次你随后调用SubmitChanges()时都会重新提交。

现在这里是真正的踢球者: 即使你在IDE中按下“停止”按钮并重新启动 ,坏值也将保留在内存中 我不明白为什么有人认为这是个好主意 – 但是系统托盘中弹出的那个小的ASP.NET图标仍在运行,它似乎可以保存你的对象缓存。 如果要刷新内存空间,则必须右键单击该图标并强制关闭它! GOTCHA!

您无法在应用程序的根文件夹上方引用任何内容。

我必须维护的所有代码仍然看起来像是用vb6编写的,显示出对新样式的完全无知。

我说的是CreateObject(),过多的<%%>块,和/或而不是AndAlso / OrElse,Len()而不是.Length(),s / o匈牙利前缀疣,Dim MyVariable没有类型,函数没有返回类型……我可以继续。

不了解框架中现有和可扩展function的大量。 经常重做的事情是成员资格,角色,授权,站点地图。 然后是控件和相关标签,可以自定义以减轻客户端ID等问题。 还有一些简单的事情,比如不知道如何正确使用.config文件将命名空间自动导入到模板中,并且能够在目录的基础上执行此操作。 标记表达式等鲜为人知的事情有时也很有价值。 当然,与所有框架一样,有一个学习曲线,总有一些东西是不可取的,但通常情况下,更好地定制和扩展现有框架而不是滚动自己的框架。

不是纯粹的ASP.NET,但……

我试图使用a)嵌套的SELECT或b)WITH子句并且无法让它工作,但显然更有知识的人(包括我合作的人)告诉我语法很好。 TURNS OUT …

无法使用OLEDB中的任何一种。

对SQL Server的OLEDB查询失败

(另外,我在OP中提到的try … catch’feature’中的response.redirect()位置很棒!很棒的线程!)

不能将INamingContainer控件内的数据绑定控件放在模板化控件(如FormView)中。 有关示例,请参阅此错误报告 。 由于INamingContainer控件为其包含的控件创建自己的命名空间,因此使用Bind()的双向数据绑定将无法正常工作。 但是当加载值时,一切看起来都会很好(因为它是用Eval()完成的),在你尝试回发它们神秘似乎没有落在数据库中的值之前。

这个问题很好地certificate了这个问题: 在formview中的AJAX Tabcontainer没有插入值

(VB.NET)如果通过Property的Get访问器将Object发送到带有ByRef关键字的函数,它实际上将尝试使用Property的Set访问器更新对象。

例如:

UpdateName(ByRef aName as String)

UpdateName(Employee.Name)将尝试使用Employee的Name属性上的Set更新名称。