2009-08-25 6 views
2

J'essaie d'utiliser du javascript sur une mise en page, et je rencontre un problème étrange où le ClientID d'un Sharepoint.WebControls.TextField semble changer entre OnLoad et la page affichée.SharePoint TextField ClientID change-t-il?

En cas OnLoad, TextField3.ClientID décide « ctl00_PlaceHolderMain_TextField3 », mais si regarder pour voir pourquoi mes js ne fonctionne pas, la page source révèle que l'ID de commande à « ctl00_PlaceHolderMain_TextField3_ctl00_TextField ».

Des idées? Que se passe-t-il?

Voici le code que je utilise:

public class PostingTemplate : Microsoft.SharePoint.Publishing.PublishingLayoutPage 
{ 
    protected DropDownList author; 
    protected TextField TextField3; 
    private List<string> _authorNames; 

    public List<string> AuthorName 
    { 
     get { return _authorNames; } 
     set { _authorNames = value; } 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.OnLoad(e); 
     author.AutoPostBack = false; 
     this.Page.ClientScript.RegisterClientScriptBlock(this.GetType(), 
     "fillInAuthorText", getQuery(), true); 
     author.Attributes.Add("onChange", "fillInAuthorText()"); 
     if (!Page.IsPostBack) 
     { 
      _authorNames = new List<string>(); 
      _authorNames = Utilities.GetAuthorList(SPContext.Current.Site); 
      author.DataSource = _authorNames; 
      author.DataBind(); 
     } 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 
     if (author.Items.Count > 0) 
     { 
      author.SelectedIndex = 0; 
      TextField3.Text = ((ListItem)author.Items[author.SelectedIndex]).Text; 
     } 
    } 

    private string getQuery() 
    { 
     string query = @" function fillInAuthorText() { 
     var IndexValue = document.getElementById('"; 
     query += author.ClientID; 
     query += @"').selectedIndex; 
     var SelectedVal = document.getElementById('"; 
     query += author.ClientID; 
     query += @"').options[IndexValue].value; 
     document.getElementById('"; 
     query += TextField3.ClientID; 
     query += @"').value = SelectedVal; 
     }"; 
     return query; 
    } 
} 

Répondre

1

Vous devez inclure l'ID client du contrôle des parents aussi bien.

// Replace: 
query += author.ClientID; 
// With: 
query += base.ClientID + "_" + author.ClientID; 

(Notez que je ne l'ai jamais fait cela avec une partie Web afin qu'il peut y avoir quelques ajustements que vous devez faire pour que cela fonctionne dans une mise en page.)

Une autre option consiste à résoudre ce côté client. Voir Eric Shupp's blog pour plus d'informations.

0

Avec l'aide sous forme Alex Angas, voici ce que je découvre. Le TexField rend quelques littéraux qui finissent autour d'une zone de texte, et il est vraiment la zone de texte que vous êtes intéressé est ici la section modifiée du code:

Gardez à l'esprit, ceci est spécifique à mon application, votre kilométrage peut varier.
private string getQuery() 
    { 
     string query = @" function fillInAuthorText() { 
     var IndexValue = document.getElementById('"; 
     query += author.ClientID; 
     query += @"').selectedIndex; 
     var SelectedVal = document.getElementById('"; 
     query += author.ClientID; 
     query += @"').options[IndexValue].value; 
     document.getElementById('"; 
     query += getTextFieldID(TextField3); 
     query += @"').value = SelectedVal; 
     }"; 
     return query; 
    } 

    private string getTextFieldID(Control txt) 
    { 
     foreach (Control c in txt.Controls) 
     { 
      if (c.HasControls()) 
      { 
       foreach (Control con in c.Controls) 
        if (con is TextBox) 
         return con.ClientID; 
      } 
     } 

     return ""; 
    }