我正在尝试在页面布局上使用一些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;
}
}
答案 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 "";
}
请注意,这是我的申请所特有的,我的里程数各不相同。