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

4
我希望能够从自定义的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>

2
你尝试过这个吗?发生了什么事情?或者你期望发生的事情没有发生吗? - Hans Kesting
@Hans和Mattias,我编辑了问题,希望现在更清晰了... - Paolo Tedesco
1个回答

8

非常抱歉回答自己的问题,但我已经找到了几种解决方法,并且认为它们可能对其他人也有用:)

要将对象序列化为控件属性,您必须定义一个适当的,并将应用于属性类型。以下是一个示例:如何:实现类型转换器

更简单的方法是,您可以像这样将属性保留在控件内容中:

<%@ 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;
    }
}

抱歉我的回答。我当时非常确定你做不到这一点(虽然我不再使用WebForms)。 - Mattias Jakobsson
@Mattias:别担心,我猜你只是想帮忙 :) - Paolo Tedesco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接