J'ai construire un contrôle simple appelé Menu:VS 2008, ASP.NET: Générer des ressources locales
namespace MyControls
{
public class MenuItem
{
public MenuItem()
{
Visible = true;
}
[Localizable(true)]
public string Text { get; set; }
[Localizable(false)]
public string Link { get; set; }
[DefaultValue(true)]
public bool Visible { get; set; }
}
public class MenuDesigner : System.Web.UI.Design.ControlDesigner
{
...
}
[ParseChildren(true, "Items")]
[PersistChildren(false)]
[Designer(typeof(MenuDesigner))]
public class Menu : Control
{
...
public Menu()
{
}
...
private List<MenuItem> _items = new List<MenuItem>();
[PersistenceMode(PersistenceMode.InnerProperty)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<MenuItem> Items
{
get
{
return _items;
}
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
... // More Controls.
list = new BulletedList();
list.DisplayMode = BulletedListDisplayMode.HyperLink;
this.Controls.Add(list);
foreach (var mi in _items)
{
list.Items.Add(new ListItem(mi.Text, Page.Request.CreateUrl(mi.Link)));
}
}
}
}
Je l'utilise dans ma page de cette façon:
<my:Menu ID="menu" runat="server" Text="MenuTitle">
<my:MenuItem Text="text" Link="link1.aspx">
</my:MenuItem>
<my:MenuItem Text="text2" Link="link2.aspx">
</my:MenuItem>
</my:Menu>
Cela fonctionne. Pas de problème. Lorsque je passe à la vue Designer, je vois le contrôle de la façon dont mon MenuDesigner le rend. Reformater avec CTRL-K, CTRL-D fonctionne. Exécution de mon WebPage rend à Menu la façon dont je l'attendais.
Mais: quand je frappe dans le DesingView l'élément de menu « Outils » -> « Générer des ressources locales » Je reçois ce résultat:
<my:Menu ID="menu" runat="server" Text="MenuTitle"
meta:resourcekey="menuResource9">
<my:MenuItem Text="text" Link="link1.aspx">
</my:MenuItem>
<my:MenuItem Text="text2" Link="link2.aspx">
</my:MenuItem>
<Items>
<my:MenuItem Text="text" Link="link1.aspx" meta:resourcekey="MenuItemResource10"></my:MenuItem>
<my:MenuItem Text="text2" Link="link2.aspx" meta:resourcekey="MenuItemResource11"></my:MenuItem>
</Items>
</my:Menu>
Quels attributs sont manquants/mal? J'ai regardé dans ListBox, qui analyse également des éléments enfants et j'ai le sentiment que mon contrôle fait la même chose.
Les seules différences que j'ai trouvé:
- J'utilise une liste générique, ListBox a son propre type de collection pour ListItems
- Je n'ai pas éditeur ou ControlBuilder ou TypeConverter pour mon MenuItem, ListBox ne .
Ce n'est pas un contrôle que je suis prêt à vendre, c'est seulement pour moi. Je n'ai pas besoin d'éditeur ou de Desinger, j'écris à la main le balisage HTML/ASP.NET. Je utilise Visual Studio 2008, .NET 3.5.
Merci pour tous les conseils, l'aide ou les solutions!
Oui! PersistenceMode.InnerDefaultProperty l'a fait! Je vous remercie! BTW: J'ai essayé d'implémenter un StateManagedCollection mais sans chance. OK - J'ai arrêté d'implémenter StateManagedCollection lorsque j'ai lu votre Edit. – Arthur
Oh mec, je suis tellement désolé.Ce point n'est pas le mien. Pour autant que je disais autre utilisateur répondre à votre question. Mais, il a supprimé son message. Quoi qu'il en soit, je vais écrire un exemple simple pour que vous puissiez résoudre le problème ViewState. –
Merci! Dans ce cas, je n'ai pas besoin de corriger le problème viewstate (sans utiliser viewstate) mais j'y trouve un intérêt! Donc: Pas de stress! – Arthur