을 세터의 첫 번째 줄과 같은 EnsureChildControls()
를 호출 할, 말하기 (?를 CompositeControl
그 것이다) 그러나 웹 컨트롤이 본질적으로 무국적이라는 사실 때문입니다. 포스트 백간에 액세스 할 수 있도록 설정중인 등록 정보의 값을 유지해야합니다. 아래는 asp.net viewstate를 구현 한 예제입니다.
예를 들어 상태를 활성화하고 사용자 정의 컨트롤의 CssClass 속성에서 null 조건이 발생하지 않도록하려면 다음과 같이 propery를 구현할 수 있습니다.
private string CssClass
{
get
{
return (string)ViewState["cssclass"];
}
set
{
ViewState["cssclass"] = value;
}
}
내가 최근에 작성한 샘플 사용자 정의 컨트롤이 포함되어 있습니다.이 모델에서는 작업 할 모델을 제공합니다.
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.ComponentModel;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace Pdc.EventPro.WebControls
{
[DefaultProperty("Text"), ToolboxData("<{0}:AnchorDomain1 runat=server></{0}:AnchorDomain1>")]
public class AnchorDomain : Control
{
private string _href = string.Empty;
public AnchorDomain()
{
VirtualPath = HttpContext.Current.Request.Path.Substring(0, HttpContext.Current.Request.Path.LastIndexOf("/") + 1);
}
private string VirtualPath
{
get
{
return (string)ViewState["virtualPath"];
}
set
{
ViewState["virtualPath"] = value;
}
}
[Bindable(true), Category("Content"), DefaultValue("Performance Development Corporation")]
public string Title
{
get
{
return (string)ViewState["title"];
}
set
{
ViewState["title"] = value;
}
}
[Bindable(true), Category("Content"), DefaultValue("")]
public string LinkText
{
get
{
return (string)ViewState["linktext"];
}
set
{
ViewState["linktext"] = value;
}
}
[Bindable(true), Category("Content"), DefaultValue("")]
public string Url
{
get
{
return (string)ViewState["url"];
}
set
{
ViewState["url"] = value;
}
}
[Bindable(true), Category("Content"), DefaultValue("false")]
public bool UsePageVirtualPath
{
get
{
return (bool)ViewState["useVirtualPath"];
}
set
{
ViewState["useVirtualPath"] = value;
}
}
[Bindable(true), Category("Content"), DefaultValue("false")]
public string CssClass
{
get
{
return (string)ViewState["CssClass"];
}
set
{
ViewState["CssClass"] = value;
}
}
protected override void Render(HtmlTextWriter writer)
{
if (string.IsNullOrEmpty(Url) && UsePageVirtualPath == false)
{
_href = CreateUri(HttpContext.Current.Request.Url.GetLeftPart(System.UriPartial.Authority), HttpContext.Current.Request.ApplicationPath).ToString();
}
else if (!string.IsNullOrEmpty(Url) && UsePageVirtualPath == true)
{
_href = CreateUri(HttpContext.Current.Request.Url.GetLeftPart(System.UriPartial.Authority), CombineUri(VirtualPath, Url)).ToString();
}
else
{
_href = CreateUri(HttpContext.Current.Request.Url.GetLeftPart(System.UriPartial.Authority), CombineUri(HttpContext.Current.Request.ApplicationPath, Url)).ToString();
}
writer.WriteBeginTag("a");
writer.WriteAttribute("href", _href);
writer.WriteAttribute("title", Title);
writer.WriteAttribute("class", CssClass);
writer.Write(HtmlTextWriter.TagRightChar);
writer.Write(LinkText);
writer.WriteEndTag("a");
base.Render(writer);
}
private Uri CreateUri(string baseUri, string relativeUri)
{
Uri result = null;
if (Uri.TryCreate(new Uri(baseUri), relativeUri, out result))
{
return result;
}
return result;
}
private string CombineUri(string basePath1, string basePath2)
{
return string.Format("{0}/{1}", basePath1.TrimEnd('/'), basePath2.TrimStart('/'));
}
}
}
즐기십시오!
나는 그것을'public partial class MyControl : System.Web.UI.UserControl'으로 가지고 있습니다. 나는 그것을 바꿔야합니까? – lincolnk
반드시 변경하지 않아도됩니다. 하지만 'System.Web.UI.WebControls.CompositeControl'을 살펴보고 그 것이 더 잘 작동하는지 확인해 보려면 하위 컨트롤로 구성된 컨트롤을 만들기 위해 특별히 고안된 클래스입니다. 함께 작업 할 수있는 훌륭한 기본 클래스입니다. –
EnsureChildControls() UserControl 기본 (어쩌면 내가 잘못하고 있어요) 작동하지 않는 것처럼 보였습니다 그래서 나는 그것을 CompositeControl 자료에서 다시 작성했습니다. 고마워! – lincolnk