SharePoint TextField ClientID更改?

时间:2009-08-25 01:59:12

标签: javascript sharepoint textfield

我正在尝试在页面布局上使用一些javascript,我遇到一个奇怪的问题,其中Sharepoint.WebControls.TextField的ClientID似乎在OnLoad和正在显示的页面之间发生变化。

在OnLoad事件中,TextField3.ClientID解析为“ctl00_PlaceHolderMain_TextField3”,但如果查看为什么我的js不起作用,页面源会显示控件ID为“ctl00_PlaceHolderMain_TextField3_ctl00_TextField”。

任何想法发生了什么?

这是我正在使用的代码:

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 个答案:

答案 0 :(得分:1)

您还需要包含父控件的客户端ID。

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

(请注意,我之前只使用过Web部件,因此可能需要进行一些调整才能使其在页面布局中工作。)

另一种选择是解决此客户端问题。有关大多数信息,请参阅Eric Shupp's blog

答案 1 :(得分:0)

在Alex Angas的帮助下,我发现了以下内容: 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 "";
    }

请注意,这是我的申请所特有的,我的里程数各不相同。