2010-02-12 80 views
3

我想从自定义ASP.NET用户控件中公开一个复杂属性,以便可以从aspx页面中的控件标记中设置该属性在ASP.NET用户控件中公开一个复杂的属性

事情是这样的:

public class TestData { 
    public int X; 
    public int Y; 
} 

public partial class TestControl : System.Web.UI.UserControl { 

    public TestData TestProperty { 
     get { 
      return ViewState["TestProperty"] as TestData; 
     } 
     set { 
      ViewState["TestProperty"] = value; 
     } 
    } 
} 

然后在包含我想有类似的控制页面的.aspx文件:

<div> 
    <testns:TestControl runat="server" ID="TestControl1" TestProperty="X:1,Y:2"/> 
</div> 
+2

当你尝试这样发生了什么?或者你没有预料到什么? – 2010-02-12 10:46:59

+0

你应该有什么工作。 – 2010-02-12 10:47:47

+0

@Hans和马蒂亚斯,我编辑的问题,我希望这是更清楚现在... – 2010-02-12 10:51:06

回答

6

对不起,回答我的问题,但我发现了几个这样做的方式,我想他们可能是有用的人别人也:)

序列化对象控件的属性,必须定义一个适当的TypeConverter,并应用TypeConverterAttribute的属性类型。这里是一个例子:How to: Implement a Type Converter

更容易,你可以坚持控制的内容属性,就像这样:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="wbctrlstst._Default" %> 
<%@ Register TagPrefix="x" TagName="TestControl" Src="~/TestControl.ascx" %> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <x:TestControl runat="server" ID="testlist1"> 
      <TestProperty X="1" Y="42" /> 
     </x:TestControl> 
    </div> 
    </form> 
</body> 
</html> 

唯一的要求,有什么我能看到的,是该类型必须有一个默认的构造函数。您可以将PersistenceModeAttribute的属性来指定此属性应该在控件的内容被保留,但它看起来像它的默认行为,而这并不是必需的。

[PersistenceMode(PersistenceMode.InnerProperty)] 
public TestData TestProperty { 
    get { 
     return ViewState["TestProperty"] as TestData; 
    } 
    set { 
     ViewState["TestProperty"] = value; 
    } 
} 
+0

对不起,我的答案即可。我是很肯定的,你不能这样做(我不使用的WebForms了虽然)。 – 2010-02-12 14:45:40

+0

@Mattias:别担心,我猜你只是想帮一下忙:) – 2010-02-12 14:48:52