我正在尝试在C#中使用System.Web.UI.WebControls.HyperLink
的子类,我希望能够指定一个默认的文本属性,它将在某些条件下替换文本值。
public class MyHyperLink : HyperLink
{
public string DefaultText { get; set; }
public override string Text
{
get
{
return string.IsNullOrEmpty(base.Text)
? (this.DefaultText ?? string.Empty)
: base.Text;
}
}
}
当我使用此代码时,我的超链接在页面上呈现,而不是<a>Default Text</a>
我得到了<a text="Default Text"></a>
。
答案 0 :(得分:1)
您不需要覆盖Text属性。您只需添加一个新的字符串属性并使用PersistenceMode属性进行装饰,如下所示:
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public string MyTextProperty{
get
{
return ViewState["Text"] != null ? (string)ViewState["Text"] : string.Empty;
}
set
{
this.ViewState["Text"] = value;
}
}
答案 1 :(得分:1)
你完全覆盖了Text属性的行为,但它可能无法呈现它的设计方式。你真正想要做的是覆盖Render方法:
protected override void Render(HtmlTextWriter writer)
{
if (string.IsNullOrEmpty(base.Text))
{
Text = (this.DefaultText ?? string.Empty);
}
base.Render(writer);
}
这是在控件呈现更改文本周围之前切入。它发生在控制生命周期的这么晚,它甚至不会保存在ViewState中以节省膨胀!
答案 2 :(得分:1)
根据反射器,你确实错过了一个属性,并没有覆盖setter
public class MyHyperLink : HyperLink
{
public string DefaultText { get; set; }
[PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public override string Text
{
get
{
return string.IsNullOrEmpty(base.Text) ? this.DefaultText : base.Text;
}
set
{
base.Text = value;
}
}
}