ASP.NET NullReferenceException для get_Session () - PullRequest
1 голос
/ 03 декабря 2010
public class MessageHelper : System.Web.UI.MasterPage
{
    public MessageHelper()
    {

    }

    public string Message
    {
        set { Session["Message"] = value; }
        get
        {
            if (Session["Message"] != null)
            {
                var msg = Session["Message"] as string;
                Session["Message"] = "";
                return msg;
            }
            return "";
        }
    }

    public string ErrorMsg
    {
        set { Session["Error"] = value; }
        get
        {
            if (Session["Error"] != null)
            {
                var err = Session["Error"] as string;
                Session["Error"] = "";
                return err;
            }
            return "";
        }
    }
}


[NullReferenceException: Object reference not set to an instance of an object.]
   System.Web.UI.UserControl.get_Session() +15
   WebApplication1.MessageHelper.get_ErrorMsg() in ..file.master.cs:71

где строка 71: if (Session ["Error"]! = Null)

что я здесь не так делаю?!

РЕДАКТИРОВАТЬ (переписано соригинальный автор):

@ David,

, вот AdminMaster.master.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.SessionState;

namespace WebApplication1
{
    public partial class AdminMaster : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MessageHelper msg = new MessageHelper();

            if (msg.ErrorMsg != "")
            {
                // do something
            }
            if (msg.ErrorMsg != "")
            {
                // do something
            }
        }
    }
    public class MessageHelper : System.Web.UI.MasterPage
    {
        public MessageHelper()
        {

        }

        public string Message
        {
            set { System.Web.HttpContext.Current.Session["Message"] = value; }
            get
            {
                if (System.Web.HttpContext.Current.Session["Message"] != null)
                {
                    var msg = System.Web.HttpContext.Current.Session["Message"] as string;
                    System.Web.HttpContext.Current.Session["Message"] = "";
                    return msg;
                }
                return "";
            }
        }

        public string ErrorMsg
        {
            set { System.Web.HttpContext.Current.Session["Error"] = value; }
            get
            {
                if (System.Web.HttpContext.Current.Session["Error"] != null)
                {
                    var err = System.Web.HttpContext.Current.Session["Error"] as string;
                    System.Web.HttpContext.Current.Session["Error"] = "";
                    return err;
                }
                return "";
            }
        }
    }
}

, поэтому он наследуется от System.Web.UI.MasterPage, мой плохой.

Я хочу, чтобы MessageHelper был доступен с разных страниц сайта.все мои страницы используют мастер-файл, поэтому я помещаю MessageHelper в мастер-файл.

что здесь не так?

Ответы [ 2 ]

4 голосов
/ 03 декабря 2010

Во время отладки вы можете подтвердить, что Session не равно нулю?Попробуйте указать его полностью квалифицированным как System.Web.HttpContext.Current.Session в этом классе и посмотрите, поможет ли это кому-нибудь.

Редактировать: В ответ на ответ без ответа, который вы отправили ...

Не рекомендуется помещать этот вспомогательный класс в тот же файл, что и ваша главная страница.Поместите его в свой собственный файл, названный для класса.(Возможно, есть спор о том, должен ли каждый класс иметь свой собственный файл, но в данном конкретном случае ясно, что два класса в этом одном файле очень сильно не связаны и не должны быть вместе.)

Класс можетиметь свое собственное пространство имен, такое как WebApplication1.Helpers (хотя я рекомендую в будущем использовать что-то более описательное, чем WebApplication1, но не пытайтесь изменить его здесь, потому что это вызовет ошибки в других местах проекта), и другие классыфайлы могут ссылаться на это пространство имен с помощью using WebApplication1.Helpers, чтобы использовать этот класс.

Разделение классов на интуитивно понятную структуру в проекте (или нескольких проектах по мере усложнения) облегчит поддержку вбудущее.

И, видя весь файл, класс помощника определенно не должен наследоваться от MasterPage.Это не нужно, и это добавляет к этому классу вещи, которых там быть не должно.

0 голосов
/ 04 декабря 2010

Меня немного смущает то, что вы пытаетесь достичь с помощью класса MessageHelper.

Если этот код является общим для ваших главных страниц, то вам непременно следует наследовать AdminMaster от MessageHelper.

например.

public partial class AdminMaster : MessageHelper

Если нет, я не понимаю, почему MessageHelper должен наследоваться от MasterPage?

...