在ASP.NET用户控件中公开复杂属性

Pao*_*sco 4 c# asp.net user-controls

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

像这样的东西:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在包含控件的页面的.aspx文件中,我希望有类似的内容:

<div>
    <testns:TestControl runat="server" ID="TestControl1" TestProperty="X:1,Y:2"/>
</div>
Run Code Online (Sandbox Code Playgroud)

Pao*_*sco 8

很抱歉回答我自己的问题,但我发现了几种方法,我认为它们对其他人也有用:)

要在控件的属性中序列化对象,必须定义适当的对象TypeConverter,并将a TypeConverterAttribute应用于属性类型.下面是一个示例:如何:实现类型转换器.

更简单的是,您可以将属性保存在控件的内容中,如下所示:

<%@ 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>
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一要求是该类型必须具有默认构造函数.您可以将PersistenceModeAttribute属性应用于属性以指定属性应该保留在控件的内容中,但它看起来像是默认行为,并不是严格要求的.

[PersistenceMode(PersistenceMode.InnerProperty)]
public TestData TestProperty {
    get {
        return ViewState["TestProperty"] as TestData;
    }
    set {
        ViewState["TestProperty"] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)