Question

J'ai développé une partie Web personnalisée. Avec des propriétés personnalisées, il charge un iframe avec un autre texte.

Puis j'ai essayé d'ajouter cette partie Web deux fois sur la même page, tout fonctionne bien, à l'exception de la "prévisualisation" (ONPRERENDER). Chaque fois que je change de propriétés, la page est rafraîchie (formulaire soumis). Au lieu des changements n'affectant que la partie Web que je modifie ..Ils affectent également l'autre. Mais lorsque je touche Appliquer, chacune des pièces Web va s'afficher pour obtenir les bonnes propriétés et affiche un contenu différent.

donc le problème que c'est avant de postuler. Comment puis-je garantir que seule la partie Web que je dois être modifiée?

Une partie de mon code surprendender pourrait aider.

public string Parameter
    { 
        get { return parameter; } 
        set { parameter= value; } 
    }

protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        ClientScriptManager cs = Page.ClientScript;
        cs.RegisterClientScriptInclude(this.GetType(), "jq", "/_layouts/js/jquery.js");
        cs.RegisterClientScriptInclude(this.GetType(), "custom", "/_layouts/js/custom.js");

        if(!string.IsNullOrEmpty(this.Parameter)){
           // I do some stuff here using this.Parameter like adding text to elements
          // those elements are created on CreateChildControls()
        }
     }

Ceci est applaudi de ma classe de pièce d'outil personnalisée

public override void ApplyChanges()
    {
        MyCustomWebPart wp = (MyCustomWebPart )this.ParentToolPane.SelectedWebPart;
        wp.Parameter= param.Text;
        base.ApplyChanges();
    }

sur CreateChildControls () Je crée des éléments sans contenu, et je les remplis avec le code ci-dessus. Avant de postuler si j'ai plus d'une de ces parties Web, après avoir soumis le formulaire pour modifier les propriétés, toutes les parties Web montrent le même texte, après avoir appliqué tout se passe comme si cela devrait.

Était-ce utile?

La solution

Je peux vous dire où ça va mal!

c'est ici:

    cs.RegisterClientScriptInclude(this.GetType(), "jq", "/_layouts/js/jquery.js");
    cs.RegisterClientScriptInclude(this.GetType(), "custom", "/_layouts/js/custom.js");

Comment puis-je savoir? Eh bien c'est simple! Je présume comme vous avez dit que vous avez beaucoup d'instances de personnalisé.js

Maintenant c'est là que cela devient en désordre, de la mettre simple! J'ai créé un WebPart et contient une ASCX. Le WebPart est ajouté 5 fois à la page (c'est une zone de texte qui se déplace / bas).

Pour déplacer la zone de texte J'ai ajouté JavaScript, maintenant, lorsque j'exécute le code, je remarque que toutes les 5 Textbox (WebParts) se déplacent en même temps même dans mon javascript, il devrait être aléatoire! (Chaque WebPart est ment pour se déplacer à des intervalles aléatoires les uns des autres)

expliquer ce qui se passe! JavaScript ne sait pas quel contrôle pour bouger comme ce que votre passe est exactement le même! Donc, si comme dans mon exercice, j'ai chaque zone de texte enveloppée dans une DIV avec sa classe ou sa carte d'identité comme "MOVMEME", dans le JS, j'ai dit de trouver MOVMe et de le déplacer. Comme les webparts sont répétés 5 fois plus que 5 divs avec le même identifiant "Moveme" de sorte que le code JavaScript déplace les 5 divs avec cet identifiant;), alors obtenez-vous où je vais?

Pour contourner ce problème et cibler le WebPart sélectionné, vous devez affecter un ID d'UNQIEE ou transmettre le fichier DIV automatiquement généré dans le fichier JS!

http://forums.asp.net/t/1855866.aspx < / p>

Dans votre cas, c'est en train de passer l'ID de WebParts! Que faites-vous exactement dans les fichiers JS? Il s'agit d'un problème courant lorsqu'il s'agit de multiples contrôles / WebParts à l'aide du même fichier JS à l'aide du même ID / classe.

Assurez-vous également que vos contrôles que votre paramètre a des valeurs uniques;

Vous pouvez utiliser aléatoire;

//call the random generator class
Random rnd = new Random();
//use the code below as the auto id generator for you
rnd.Next();

Le code ci-dessus sera donc utilisé dans ce sens:

Textbox tb = new Textbox();

tb.Id = rnd.Next();

Laisser les commandes sans jeu d'identification doit être généré automatiquement.

On dirait que vous avez plusieurs contrôles pour une raison quelconque avec le même identifiant! D'où la raison pour laquelle vous obtenez tous les mêmes contrôles mis à jour avec le même contenu jusqu'à ce que vous soumetiez la page

Vous devez consulter votre fichier JS pour voir ce que c'est le côté du client qui met dans le même contenu si tous les autres webparts. Lorsque vous cliquez sur le bouton Soumettre différent car les identifiants de contrôle sont générés automatiquement et que le bouton est ser qu'obverside et celui associé à ce WebPart n'est pas les autres, donc le bouton que vous cliquez ne mettant que mettre à jour le WebPart, il appartient à ... les autres en vrac Le contenu que l'événement lié aux autres WebParts est différent!

Donc, ma conclusion est .... Votre fichier JS fait quelque chose comme ça devrait. Cela ne sait pas ce que le contrôle exact doit mettre à jour le côté du client, car sa mise à jour de tous les WebParts indiquant qu'ils ont tous la même classe ou ID (pourraient être une DIV, Textbox ECT).

Une solution consiste à réussir votre identifiant au bon endroit? comme faire un parent div. Il serait unique pour chaque WebPart en incrémentant par la valeur de 1 chaque fois qu'un webpart est ajouté. Cette valeur est ensuite transmise au fichier JS pour faire ce dont il a besoin! Donc, cela ressemblerait à ceci:

webpart 1 Div ID="1"

webpart 2 Div ID="2"

webpart 3 Div ID="3"

Dans votre commande de votre enfant Créer des commandes, vous pouvez ajouter la div comme:

    //create a varible to store your unique ids
    private int ids;

    protected override void CreateChildControls()
    {
         //add a div with an id
         this.Controls.Add(new LiteralControl("<div id='" + ids + "'>"));

         //do your normal code
         //add other controls
         TextBox tb = new TextBox();
         tb.Text = "hell0" + ids;
         this.Controls.Add(tb);

         //close the div
         this.Controls.Add(new LiteralControl("</div>"));
    }

Donc, cette webpart ajout d'une zone de texte entourée d'un div avec une pièce d'identité unique

Maintenant, vous devez vous rappeler des identifiants pour chaque nouveau WebParts répétant à la page, comme:

    //save/get last known ID value to session state
    public string ControlIds
    {
        get
        {
            return Page.Session["ControlIds"] as string;
        }
        set
        {
            Page.Session["ControlIds"] = value;
        }
    }

Maintenant, AMMend CreateControls pour l'ajouter à Session State:

Ajoutez ceci en premier:

            if (ControlIds != null)
            {
                ids = int.Parse(ControlIds);
            }

Ce chèque pour voir si ce n'est pas NULL, NULL est quand il charge première, si cela ne remplit pas la valeur de l'état de la session dans la variable

            //create a random number
            Random rndID = new Random();

            //check if script value is already registered (needs to be unique)
            if (!Page.ClientScript.IsStartupScriptRegistered(this.GetType(), "test" + rndID.Next().ToString()))
            {
                   //register the js script: here im calling MoveImage in my JS file that takes a varible ID
                   Page.ClientScript.RegisterStartupScript(this.GetType(), "test" + rndID.Next().ToString(), "MoveImage(" + ids + ");", true);

                   //increment the id
                   ids++;

                   //add the current ID to session state
                   ControlIds = ids.ToString();
            }

donc le code complet .Cs sera:

    //save/get last known ID value to session state
    public string ControlIds
    {
        get
        {
            return Page.Session["ControlIds"] as string;
        }
        set
        {
            Page.Session["ControlIds"] = value;
        }
    }

    protected override void CreateChildControls()
    {

            if (ControlIds != null)
            {
                ids = int.Parse(ControlIds);
            }

         //add a div with an id
         this.Controls.Add(new LiteralControl("<div id='" + ids + "'>"));

         //do your normal code
         //add other controls
         TextBox tb = new TextBox();
         tb.Text = "hell0" + ids;
         this.Controls.Add(tb);

         //close the div
         this.Controls.Add(new LiteralControl("</div>"));

            //create a random number
            Random rndID = new Random();

            //check if script value is already registered (needs to be unique)
            if (!Page.ClientScript.IsStartupScriptRegistered(this.GetType(), "test" + rndID.Next().ToString()))
            {
                   //register the js script: here im calling MoveImage in my JS file that takes a varible ID
                   Page.ClientScript.RegisterStartupScript(this.GetType(), "test" + rndID.Next().ToString(), "MoveImage(" + ids + ");", true);

                   //increment the id
                   ids++;

                   //add the current ID to session state
                   ControlIds = ids.ToString();
            }
    }

Dans votre fichier JS, vous pouvez voir que sa valeur de la valeur en faisant ceci:

Fonction MoveImage (Arg) { alerte ("Cet identifiant de contrôle est" + arg);

}

Dans le fichier JS, vous pouvez maintenant faire ce que vous voulez en passant par le parent (DIV ID) à ses frères et sœurs (uniquement sur ce WebPart spécifique)

Désolé pour le code long Winded!

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top