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?

Était-ce utile?

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"]
Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top