将值绑定到usercontrol的问题

时间:2013-01-16 23:05:17

标签: c# asp.net user-controls

我遇到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

1 个答案:

答案 0 :(得分: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,但在MainMenu2中定义了mn的类型,并添加了尚未加载的对象。