我遇到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
答案 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
的类型,并添加了尚未加载的对象。