Предоставление сложного свойства в пользовательском элементе управления ASP.NET - PullRequest
3 голосов
/ 12 февраля 2010

Я хотел бы предоставить сложное свойство из пользовательского элемента управления 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 Ответ

7 голосов
/ 12 февраля 2010

Извините за ответ на мой собственный вопрос, но я нашел несколько способов сделать это, и я подумал, что они могут быть полезны и для кого-то еще :)

Чтобы сериализовать объект в атрибуте элемента управления, вы должны определить соответствующий TypeConverter и применить 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>

Единственное требование, которое я видел, это то, что тип должен иметь конструктор по умолчанию. Вы можете применить PersistenceModeAttribute к свойству, чтобы указать, что свойство должно сохраняться в содержимом элементов управления, но похоже, что это поведение по умолчанию, и это не является строго обязательным.

[PersistenceMode(PersistenceMode.InnerProperty)]
public TestData TestProperty {
    get {
        return ViewState["TestProperty"] as TestData;
    }
    set {
        ViewState["TestProperty"] = value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...