SharePoint TextField ClientID меняется? - PullRequest
2 голосов
/ 25 августа 2009

Я пытаюсь использовать некоторый JavaScript на макете страницы, и я сталкиваюсь со странной проблемой, когда ClientID для Sharepoint.WebControls.TextField, кажется, меняется между OnLoad и отображаемой страницей.

В событии OnLoad TextField3.ClientID преобразуется в «ctl00_PlaceHolderMain_TextField3», но если посмотреть, почему мой js не работает, источник страницы обнаружит, что идентификатором элемента управления является «ctl00_PlaceHolderMain_TextField3_ctl00_TeF».

Есть идеи, что происходит?

Вот код, который я использую:

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;
    }
}

Ответы [ 2 ]

1 голос
/ 25 августа 2009

Также необходимо указать идентификатор клиента родительского элемента управления.

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

(Обратите внимание, что я когда-либо делал это только с веб-частью, поэтому может потребоваться некоторая настройка, чтобы она работала в макете страницы.)

Другой вариант - разрешить эту сторону клиента. См. блог Эрика Шуппа для большей информации.

0 голосов
/ 26 августа 2009

С помощью формы Алекса Ангаса вот что я обнаружил: TexField выводит некоторые литералы, которые в конечном итоге окружают текстовое поле, и это действительно текстовое поле, которое вас интересует. Вот модифицированный раздел кода:

 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 "";
    }

Имейте в виду, это зависит от моего приложения, ваш пробег может варьироваться.

...