我想从自定义 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;
}
}
}
然后在包含控件的页面的 .aspx 文件中,我希望有类似的内容:
<div>
<testns:TestControl runat="server" ID="TestControl1" TestProperty="X:1,Y:2"/>
</div>
很抱歉回答我自己的问题,但我发现了几种方法,我认为它们对其他人也可能有用:)
要序列化控件属性中的对象,您必须定义适当的TypeConverter
,并应用TypeConverterAttribute
到属性类型。这是一个例子:如何:实现类型转换器 http://msdn.microsoft.com/en-us/library/ayybcxe5.aspx.
更简单的是,您可以将属性保留在控件的内容中,如下所示:
<%@ 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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)