2010-02-12 6 views
3

Je souhaite exposer une propriété complexe à partir d'un contrôle utilisateur ASP.NET personnalisé, de telle sorte qu'il puisse être défini à partir de la balise de contrôle dans la page aspx .Affichage d'une propriété complexe dans un contrôle utilisateur ASP.NET

Quelque chose comme ceci:

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

Et puis dans le fichier .aspx d'une page qui contient le contrôle, je voudrais avoir quelque chose comme:

<div> 
    <testns:TestControl runat="server" ID="TestControl1" TestProperty="X:1,Y:2"/> 
</div> 
+2

Que s'est-il passé lorsque vous avez essayé cela? Ou qu'est-ce qui ne s'est pas passé comme prévu? –

+0

Ce que vous avez devrait fonctionner. –

+0

@Hans et Mattias, j'ai édité la question, j'espère que c'est plus clair maintenant ... –

Répondre

6

Désolé pour répondre à ma propre question , mais j'ai trouvé quelques façons de le faire, et je pensais qu'ils pourraient être utiles aussi pour quelqu'un d'autre :)

Pour sérialiser l'objet dans un attribut du contrôle, vous Vous devez définir un TypeConverter approprié et appliquer un TypeConverterAttribute au type de propriété. Voici un exemple: How to: Implement a Type Converter.

encore plus facile, vous pouvez conserver l'attribut dans le contenu de la commande comme ceci:

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

La seule exigence, pour ce que je pouvais voir, est que le type doit avoir un constructeur par défaut. Vous pouvez appliquer le PersistenceModeAttribute à la propriété pour spécifier que la propriété doit être conservée dans le contenu des contrôles, mais il semble que ce soit le comportement par défaut, et ce n'est pas strictement nécessaire.

[PersistenceMode(PersistenceMode.InnerProperty)] 
public TestData TestProperty { 
    get { 
     return ViewState["TestProperty"] as TestData; 
    } 
    set { 
     ViewState["TestProperty"] = value; 
    } 
} 
+0

Désolé pour ma réponse alors. J'étais tellement sûr que vous ne pouviez pas faire cela (je n'utilise plus de webforms). –

+0

@Mattias: ne vous inquiétez pas, je suppose que vous essayiez juste d'être utile :) –

Questions connexes