很明显,每次刷新页面时,ASP.NET页面的成员变量都会丢失范围。
我有以下代码来显示具有编辑功能的“警报”网格:
public partial class Alerts : System.Web.UI.Page
{
private _WikiSyntaxEngine;
protected void Page_Load(object sender, EventArgs e)
{
_WikiSyntaxEngine = new WikiSyntaxEngine();
}
protected void gvAlerts_RowDataBound(object sender, GridViewRowEventArgs e)
{
var alert = (DataModel.Alert)(e.Row.DataItem);
// Below is the only line of interest, because only when published
// to the server would it throw an exception...
string html = _WikiSyntaxEngine.ConvertWikiTextToHTML(alert.Description);
}
}
仅在我发布的开发服务器上,此代码在更新行期间失败(即抛出NullReferenceException
,因为_WikiSyntaxEngine
为null
)。
但是,在我的本地计算机上,代码运行正常 - 行已更新,网格将按预期刷新。
我已经修改了代码,使WikiSyntaxEngine
成为单例,或者应该从一开始就设计它的方式,因为它不应该在任何地方被实例化。
我的问题是,Page_Load
事件如何在我的本地计算机上gvAlerts_Databound()
之前调用(如预期的那样),但是在开发机器上没有调用,导致NullReferenceException
为_WikiSyntaxEngine
{{1}}?
答案 0 :(得分:1)
我假设你的gvAlerts
GridView是在页面的ASP.NET标记中定义的。如果是这种情况,可能是OnInit()
事件中的DataBound,而不是Page_Load()
,您实例化WikiSyntaxEngine
。
如果你的GridView在OnInit()
之前被绑定,你可能应该使用WikiSyntaxEngine
来实例化Page_Load
。
至于为什么你在开发和生产中获得不同的行为对我来说仍然是一个谜。