【问题标题】:Object reference not set to an instance of an object error对象引用未设置为对象错误的实例
【发布时间】:2011-08-24 13:39:12
【问题描述】:

我有 Default.aspx 和 Upload.aspx。 我通过查询字符串将 ID 传递给default.aspx(like:http://localhost:3081/default.aspx?Id=1752)。在默认页面中,我有一个链接按钮来打开upload.aspx 以上传文件。当我在upload.aspx 中使用Request.QueryString["Id"] 时,它是将错误显示为“对象引用未设置为对象的实例”。我正在处理 RadControls。 当我点击一个链接时打开(OnClientClick="return ShowAddFeedBackForm()")我有这样的代码:

<script>
function ShowAddFeedBackForm() {
            window.radopen("Upload.aspx", "UserListDialog");
           return false;
    }
</script>

我在带有文本框和文件上传控件的上传页面中使用 detailsview。

上传文件时在upload.aspx中绑定的代码

protected void DetailsView1_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
string qString = Request.QueryString["Id"].ToString();
       if (DetailsView1.CurrentMode == DetailsViewMode.Insert)
       {

           //string qString = Request.QueryString["Id"].ToString();
           //int Projectid = Convert.ToInt32(Session["ProjectId"]);
           ProTrakEntities objEntity = new ProTrakEntities();
           TextBox txtTitle = DetailsView1.FindControl("txtTask") as TextBox;
           //RadComboBox cmbStatus = DetailsView1.FindControl("cmbStatus") as RadComboBox;
           //var id = (from project in objEntity.Projects where project.ProjectId == Projectid select project).First();
           RadComboBox cmbTaskType = DetailsView1.FindControl("cmbTasktype") as RadComboBox;
           //RadComboBox cmbTaskPriorty = DetailsView1.FindControl("cmbPriority") as RadComboBox;

           string Description = (DetailsView1.FindControl("RadEditor1") as RadEditor).Content;



           var guid = (from g in objEntity.Projects where g.ProjectGuid == qString select g).First();
           int pID = Convert.ToInt32(guid.ProjectId);

           ProjectFeedback objResource = new ProjectFeedback();
           objResource.ProjectId = pID;
           objResource.Subject = txtTitle.Text;
           objResource.Body = Description;
           objResource.CreatedDate = Convert.ToDateTime(System.DateTime.Now.ToShortDateString());
           objResource.FeedbackType = cmbTaskType.SelectedItem.Text;
           objEntity.AddToProjectFeedbacks(objResource);
           objEntity.SaveChanges();

           DetailsView1.ChangeMode(DetailsViewMode.ReadOnly);
           ClientScript.RegisterStartupScript(Page.GetType(), "mykey", "CloseAndRebind('navigateToInserted');", true);


       }

}

查询字符串语句出错-“对象引用未设置为对象的实例”

【问题讨论】:

  • 从错误中插入堆栈跟踪会很有帮助。
  • 谢谢您的回复先生。我没有得到您从堆栈跟踪插入的内容。
  • 堆栈跟踪是异常中列出的一长串方法,当它告诉您对象引用未设置为对象的实例时。通常有一个被调用的方法列表,最终导致产生错误的方法被产生。
  • 查看我刚刚发布的答案,我确切地解释了您需要做什么才能使其正常工作。

标签: asp.net query-string rad-controls


【解决方案1】:

打开新页面时不会继承查询字符串。您必须在 URL 中包含 id,即Upload.aspx?id=1752

编辑:

一个简单的解决方案是只复制页面 URL 的搜索部分:

window.radopen("Upload.aspx" + document.location.search, "UserListDialog");

但是,通常您会使用从服务器端代码中的查询字符串中获取的 id 值并生成客户端代码以使用它。

【讨论】:

  • 谢谢您的回复先生。我们如何定义这样的?因为当我们单击链接按钮时,Upload.aspx 将打开。如果我们以任何方式传递它,当下次在查询字符串中传递不同的 ID。
  • 没错。最有可能的是,错误在这里:string qString = Request.QueryString["Id"].ToString(); 由于 QueryString["Id"] 返回 null,因此在 .ToString() 上引发了异常。
  • @user:您显然不会对 ID 进行硬编码。您显然必须从调用窗口的页面的查询字符串中获取 ID。
  • 我同意这很可能是产生错误的地方。如您所见,此错误可能来自很多地方。在使用它们之前测试你的对象是否为空是明智的。
  • 是的先生,oscilatingcretin,我在查询字符串语句中遇到错误。意味着我是空的。那么如何在调用默认页面时获取作为查询字符串传递的上传页面中的 ID?
【解决方案2】:

我不确定,但如果我不得不猜测,我会质疑窗口对象是否在您在页面的脚本部分调用 radopen 时被实例化。您应该在调用 window.radopen() 调用之前放置一个 msgbox 以打印窗口对象的内容,如果它是您的问题,否则这将需要更多的挖掘。只是我的两分钱。

【讨论】:

    【解决方案3】:

    我还注意到,如果 guid 查询没有返回任何结果,对 .First() 的调用也会导致此错误。只是在研究问题时检查的另一个地方。

    【讨论】:

      【解决方案4】:

      如果 objEntities 构造失败并返回空引用,我看到的最后一个地方也可能引发此错误,然后对对象属性的任何调用都会生成此错误(即 objEntitiey.Projects):

       ProTrakEntities objEntity = new ProTrakEntities();  
       var guid = (from g in objEntity.Projects where g.ProjectGuid == qString select g).First();            
      

      【讨论】:

        【解决方案5】:

        发生此错误是因为,正如其他回答者所说,您需要将 ID 传递给 RadWindow,因为 RadWindow 对调用它的页面一无所知。你得到一个空引用异常,因为窗口找不到查询字符串,所以当你尝试引用 .ToString() 时它会抛出一个异常。

        要让它工作,让你的 Javascript 函数像这样:

        function ShowAddFeedBackForm(Id) {
            window.radopen(String.format("Upload.aspx?Id={0}", Id), "UserListDialog");
            return false;
        }
        

        在基本页面(即打开窗口的页面)的代码隐藏 Page_Load 事件中,输入:

        if (!IsPostBack)
            Button.OnClientClick = string.Format("javascript:return ShowAddFeedBackForm({0});", Request.QueryString["Id"]);
        

        当然,Button 应该是您页面上按钮的 ID。

        【讨论】:

        • 我刚刚更正了Id 参数的大小写。在javascript函数中,它是id,但应该是Id
        • 我们如何将来自默认页面的 ID 传递给 ShowAddFeedBackForm(Id)。我们使用 querystring["Id"] 在 defaultpage 的代码隐藏中获取 id。ID 在默认情况下应该可用,但是当我们单击默认页面中的链接按钮时,会调用上传页面。
        • 我进行了编辑以消除歧义。通过代码隐藏,我说的是基本页面的代码隐藏,而不是在 RadWindow 中打开的页面。
        • 是的先生,我试过我在 request.querystring[] 中获取值,但是当我们在 string.format 占位符中使用它时,它显示相同,对象引用未设置为实例。
        • 在您设置 .OnClientClick 属性的行上放置一个断点。跳过它并确保 Javascript 是正确的。还要确保您没有在代码的其他地方覆盖它。为了安全起见,请从按钮的标记中删除 OnClientClick。
        猜你喜欢
        • 2011-07-09
        • 2012-08-31
        • 2011-11-21
        • 2012-10-01
        • 1970-01-01
        • 2022-08-18
        • 2012-09-19
        相关资源
        最近更新 更多