Est-il possible de charger un UserControl dans un objet anonyme, au lieu d'instancier?
-
26-09-2019 - |
Question
Actuellement, je suis générer UserControls comme suit dans une classe de base abstraite de sorte qu'ils sont disponibles pour toutes les autres pages qui mettent en œuvre la classe de base:
// doc is an XML file that may or may not contain a TopStrapline node
var pageControls = new {
TopStrapline = (from strap in doc.Elements("TopStrapline")
select new TopStrapline
{
StraplineText =
(string)strap.Attribute("text")
}).FirstOrDefault(),
// loads of other UserControls generated from other nodes
};
// if there's a StrapLine node, I want to make it available as a property
// in this base class. Any page that needs a TopStrapline can just add the base
// class's TopStrapline to a placeholder on the page.
if (pageControls.TopStrapline != null)
{
this.TopStrapline = GetTopStrapline(pageControls.TopStrapline);
}
private TopStrapline GetTopStrapline(TopStrapline strapline)
{
TopStrapline topStrapline = (TopStrapline)LoadControl("~/Path/TopStrapline.ascx");
topStrapline.StraplineText = strapline.StraplineText;
return topStrapline;
}
Qu'est-ce qui me casser les pieds sur ce code est que je peux créer une instance de TopStrapline
avec le LinqToXML mais il est pas bon comme un contrôle utilisateur parce que je dois charger le UserControl avec LoadControl
. Cela fonctionne, mais il semble un peu maladroit. Idéalement, je pouvais exécuter LoadControl
directement dans le pageControls
objet anonyme, puis attribuez-lui que le contrôle chargé dans la propriété de la page.
Est-ce possible? Quelqu'un peut-il suggérer une meilleure solution à ce problème? Merci
La solution
Would ce travail pour vous?
this.TopStrapline = doc.Elements("TopStrapline")
.Select(e => {
var control = (TopStrapline)LoadControl("~/Path/TropStrapLine.ascx");
control.StraplineText = e.Attribute("text");
return control;
}).FirstOrDefault();