Accès aux commandes de la page Mise en code derrière
-
16-10-2019 - |
Question
Je construis plusieurs mises en page d'édition pour un public face à site SharePoint 2010. Un de mes mises en page est associé à un type de contenu qui a environ 20 champs.
Je voudrais afficher tous ces champs dans le format de quelque chose comme:
<p>Field Name</p>
<p>Field Value</p>
assez facile à faire avec les commandes FieldLabel et fieldValue:
<asp:Content ContentPlaceholderID="PlaceHolderMain" runat="server">
<SharePointWebControls:FieldLabel id="flSomeField" runat="server" FieldName="SomeField" />
<SharePointWebControls:FieldValue id="fvSomeField" runat="server" FieldName="SomeField" />
</asp:Content>
Cependant, je veux seulement afficher le contrôle FieldLabel si le champ a une valeur.
Dans le code sous-jacent de la mise en page, je ne le suit dans le cadre de chargement de la page:
var listItem = SPContext.Current.ListItem;
if (listItem != null)
{
var someField = String.Empty;
if (listItem.TryGetValue<string>("SomeField", out someField))
if (String.IsNullOrEmpty(someField))
// Find the control and set its visibility
}
Je vais avoir du mal à trouver le contrôle FieldLabel.
J'ai écrit une méthode d'extension récursive:
public static T FindControl<T>(this ControlCollection controls, string id) where T : Control
{
T found = default(T);
if (controls != null && controls.Count > 0)
{
for (int i = 0; i < controls.Count; i++)
{
if (controls[i] is T && controls[i].ID.Equals(id, StringComparison.InvariantCultureIgnoreCase))
{
found = controls[i] as T;
break;
}
else
found = FindControl<T>(controls[i].Controls, id);
}
}
return found;
}
que j'appelle comme ceci:
var flSomeField = this.Controls.FindControl<FieldLabel>("flSomeField");
mais il est un gâchis récursif pour le moins ...
Toute réflexion sur la meilleure façon de faire, ou est-il une autre approche que je devrais considérer?
La solution
Essayez d'ajouter la variable membre:
public class XYX : PublishingLayoutPage {
protected FieldLabel flSomeField;
}
Et ASP.NET devrait automatiquement le fil vers le haut. Ensuite, vous pouvez utiliser:
flSomeField.DoStuff();
C'est si le conteneur de dénomination est portée
Autres conseils
Vous devriez être en mesure d'accéder aux commandes de votre code-behind en utilisant:
this.flSomeField
Peut-être que le problème est dans la définition de votre code-behind classe ou dans la référence à votre fichier de code dans la directive page.
Essayez d'insérer votre méthode OnLoad dans une balise de script dans votre fichier .aspx au lieu de votre fichier code-behind, juste pour vérifier que vos commandes sont accessibles.
Vous pouvez y accéder à partir du sharepoint pas de la page elle-même comme ceci
Microsoft.SharePoint.SPContext.Current.ListItem["FieldName"]
et si vous avez besoin du champ lui-même pas la valeur
Microsoft.SharePoint.SPContext.Current.ListItem.Fields["FieldName"]