3

我在使用usercontrol. 我已经做了很多小时了,所以现在必须寻求帮助。

如果我像这样从标记页面调用用户控件:

<uc7:MenuMain2 ID="MenuMain2" runat="server" RootCategoryId="4" ImageHeight="40"
                        ImageWidth="260" />

它工作正常。


我也可以这样称呼它:

Control cont = LoadControl(@"../usercontrols/MenuMain2.ascx");
ContentPlaceHolder1.Controls.Add(cont );

这也很好。但是我也无法像我需要的那样设置属性。


但是,如果我将其称为如下代码中的代码的占位符,则它不起作用。我收到了我在页面底部发布的错误。

Usercontrol代码文件 - MenuMain.ascx.cs

public partial class MenuMain2 : System.Web.UI.UserControl {

 public int ActiveCategoryId { get; set; }
 public int RootCategoryId { get; set; }
 public int articleID = 0;
 public int ImageWidth ;
 public int ImageHeight ;

  protected void Page_Load(object sender, EventArgs e) {
        if (!Page.IsPostBack)
            BindData();
    }

    private void BindData() {
        CategoriesService catSvc = new CategoriesService();
        if (ActiveCategoryId == 0) {
            if (articleID > 0) {
                M02ArticlesService artSvc = new M02ArticlesService();
                List<M02ArticlesEntity> artList = artSvc.FindById(articleID);
                if (artList.Count > 0)
                    ActiveCategoryId = artList.First().CategoryId;
            }
        }
        List<CategoriesEntity> catList = new List<CategoriesEntity>();
        catList = catSvc.GetPublishedByParentCategoryId(RootCategoryId);
        ViewState.Add("ActiveCategoryId", ActiveCategoryId);
        Repeater1.DataSource = catList;
        Repeater1.DataBind();
    }
}

的代码隐藏Masterpage

        public HttpCookie authCookie;
        public FormsAuthenticationTicket ticket;
        private string name;
        private MenuMain2 mn;

        protected void Page_Load(object sender, EventArgs e)
        {
            mn = new MenuMain2 {RootCategoryId = 4,ImageHeight = 100, ImageWidth = 260}
            //Control cont = LoadControl(@"../usercontrols/MenuMain2.ascx");

            if (Request.Cookies[".ASPXAUTH"] != null)
            {
                authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
                ticket = FormsAuthentication.Decrypt(authCookie.Value);
                name = ticket.Name;
            }

            if (name != null)
            {
                if (name.Equals("Jhon"))
                {
                    mn.RootCategoryId = 1;
                }
                if (name.Equals("Bob"))
                {
                    mn.RootCategoryId = 2;
                }
                if (name.Equals("Tom"))
                {
                    mn.RootCategoryId = 3;
                }
            }

            ContentPlaceHolder1.Controls.Add(mn);
            CategoriesEntity cat;
            int catId = Request.GetCategoryId();

            if (catId > 0)
            {
                cat = new CategoriesService().GetById(catId);
                if (cat != null && cat.RequireLogin && Request.Url.LocalPath != "/login.aspx")
                {
                    if (!view_M06PersonsCategoriesService.HasAccess(HttpContext.Current.User.Identity.Name, catId))
                    {
                        Response.Redirect(string.Format("~/login.aspx?ReturnUrl={0}&qs={1}&CatId={2}{3}",
                                                         Server.UrlEncode(Request.Url.LocalPath),
                                                         Server.UrlEncode(Request.Url.Query),
                                                         Request.QueryString["CatId"],
                                                         Request.QueryString["ArtId"].IsEmpty() ? String.Empty : "&ArtId=" + Request.QueryString["ArtId"]));
                    }
                }
            }

            if (!Page.IsPostBack)
            {
                litAdmin.Text = ConfigurationManager.AppSettings["WebName"].ToString();
                string url = Request.ServerVariables["URL"].ToString();
                if (url.ToLower().StartsWith("/default.aspx"))
                    GetPhotoalbum();
            }
        }
      }
    }

错误信息 - 应用程序中的第 42 行是这一行 -- Repeater1.DataSource = catList;--

`Object reference not set to an instance of an object.`

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.]
   No.Itl.Web.WebApplication.usercontrols.MenuMain2.BindData() in e:\WorkFolder\usercontrols\MenuMain2.ascx.cs:42
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +24
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +41
   System.Web.UI.Control.OnLoad(EventArgs e) +131
   System.Web.UI.Control.LoadRecursive() +65
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Control.LoadRecursive() +190
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2427
4

1 回答 1

1

试试这个:

MenuMain2 mn = (MenuMain2)LoadControl(@"../usercontrols/MenuMain2.ascx");

....

if (name != null)
{
    if (name.Equals("Jhon"))
    {
        mn.RootCategoryId = 1;
    }
    if (name.Equals("Bob"))
    {
        mn.RootCategoryId = 2;
    }
    if (name.Equals("Tom"))
    {
        mn.RootCategoryId = 3;
    }
}

您正在将 UserControl 加载到其中cont,但定义了MainMenu2in类型mn并添加了尚未加载的对象。

于 2013-01-16T23:56:00.257 回答