覆盖HyperLink.Text属性无法正常工作

时间:2011-06-01 08:05:30

标签: c# asp.net hyperlink properties override

我正在尝试在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>

3 个答案:

答案 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;
        }
    }
}