【问题标题】:Exposing a complex property in an ASP.NET user control在 ASP.NET 用户控件中公开复杂属性
【发布时间】:2011-01-16 02:37:01
【问题描述】:

我想从一个自定义的 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>

【问题讨论】:

  • 当你尝试这个时发生了什么?或者发生了什么出乎意料的事情?
  • @Hans 和 Mattias,我编辑了这个问题,希望现在更清楚......

标签: c# asp.net user-controls


【解决方案1】:

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

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

【讨论】:

  • 那么对不起我的回答。我很确定你不能这样做(不过我不再使用网络表单了)。
  • @Mattias:别担心,我猜你只是想帮忙:)
猜你喜欢
  • 2018-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多