代码之家  ›  专栏  ›  技术社区  ›  Paolo Tedesco

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

  •  3
  • Paolo Tedesco  · 技术社区  · 15 年前

    我想公开自定义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>
    
    1 回复  |  直到 15 年前
        1
  •  6
  •   Paolo Tedesco    15 年前

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

    要序列化控件属性中的对象,必须定义适当的 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;
        }
    }