自定义Web控件 - ParseChildren&资源对象

时间:2010-04-20 16:00:04

标签: asp.net controls

我希望有人可以帮助我。我有以下自定义服务器控件:

[ParseChildren(true)]
public class MyControl : WebControl, INamingContainer
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public string MyProperty
    {
      get;set;
    }
}

它与以下标记完美配合:

<acme:MyControl runat="sever">
    <MyProperty>Test String</MyProperty>
</acme:MyControl>

但是如果我尝试本地化属性字符串,我会得到一个解析错误:

<acme:MyControl runat="sever">
    <MyProperty><%=(string)GetLocalResourceObject("MyResourceKey") %></MyProperty>
</acme:MyControl>

即使我转换类型,ASP.NET也表示该属性不能接受控件作为子项。如果我想要本地化它,表达式应该如何?我可以将属性作为控件标签的属性进行访问,但我更喜欢上面的标记,它看起来更优雅和干净。

由于

1 个答案:

答案 0 :(得分:0)

添加名为MyPropertyResourceKey的第二个属性,因此您的最终代码为:

[ParseChildren(true)]
public class MyControl : WebControl, INamingContainer
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public string MyProperty
    {
      get;set;
    }

    string _propertyResourceKey;
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public string MyPropertyResourceKey
    {
      get {
         return _propertyResourceKey;
      }
      set {
         _propertyResourceKey = value;

         MyProperty = (string)GetLocalResourceObject(_propertyResourceKey);
      }
    }
}

编辑: 根据评论,似乎也可能需要更灵活的方法。通常,如果您要为控件分配动态值,则需要创建数据绑定控件(如果适用)http://msdn.microsoft.com/en-us/library/ms366540.aspx

另一方面,如果控件不知道通常如何分配它,则接受的方法是在页面的代码隐藏中分配属性值。