我正在尝试为需要复杂验证处理的表单创建渲染模板。 渲染模板正常运行:
<XmlDocuments>
<XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
<FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms">
<Display>ListForm</Display>
<Edit>ChaisTemplate</Edit>
<New>ChaisTemplate</New>
</FormTemplates>
</XmlDocument>
</XmlDocuments>
和我的ascx:
<%@ Control AutoEventWireup="true" CodeBehind="ChaisTemplate.ascx.cs"
Inherits="TransactionsFormsTemplates.ControlTemplates.ChaisTemplate, TransactionsFormsTemplates"
Language="C#" %>
<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register TagPrefix="SharePoint" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
Namespace="Microsoft.SharePoint.WebControls" %>
<%@ Register TagPrefix="wssuc" TagName="ToolBar" Src="~/_controltemplates/ToolBar.ascx" %>
<%PageLoad(this, null);%>
<SharePoint:RenderingTemplate ID="ChaisTemplate" runat="server">
.....
但我的代码后面没有任何控件映射(在带有cas策略的webapp bin中,并且它已正确部署) 这个:
<asp:TextBox runat="server" ID="test"></asp:TextBox>
当涉及到时,
为空
public partial class ChaisTemplate : System.Web.UI.UserControl
{
protected TextBox test;
所以每当我在函数上调用test.Text时,我都会得到一个nullreferenceexception,因为test永远不会映射到我的ascx文本框。为什么? 另外,PageLoad永远不会像经典的asp.net页面一样调用,即使使用&lt;%PageLoad(this,null);%&gt;在开始。 但是每个事件都有效:
<asp:Button runat="server" ID="button" OnClick="button_OnClick"/>
这实际上会在我的代码后面调用button_OnClick。但是我的所有属性都是null,因为没有映射。
我错过了什么吗?答案 0 :(得分:0)
我一直这样做。以此为例RenderingTemplate:
<SharePoint:RenderingTemplate ID="ParentItemsListView" runat="server">
<Template>
<table cellpadding=0 cellspacing=0>
<tr><td nowrap class="UserGenericHeader"><asp:Label ID="lblParentItems" runat="server" /></td></tr>
<tr><td><SharePoint:ListViewByQuery ID="listViewByQuery" runat="server" /><br /></td></tr>
</table>
</Template>
</SharePoint:RenderingTemplate>
然后在Render事件中,我可以像这样引用这些控件:
[SharePointPermission(SecurityAction.Demand, ObjectModel = true)]
protected override void Render(HtmlTextWriter output)
{
if (this.Visible)
{
Label lblParentItems = this.TemplateContainer.FindControlRecursive<Label>("lblParentItems");
lblParentItems.Text = "Pievienotie " + this.ChildList.Title;
ListViewByQuery listView = TemplateContainer.FindControlRecursive<ListViewByQuery>("listViewByQuery");
listView.List = this.ChildList;
...
base.Render(output);
}
}
啊,是的,我使用了一个方便的扩展功能
public static T FindControlRecursive<T>(this Control parentControl, string id) where T : Control
{
T ctrl = default(T);
if ((parentControl is T) && (parentControl.ID == id))
return (T)parentControl;
foreach (Control c in parentControl.Controls)
{
ctrl = c.FindControlRecursive<T>(id);
if (ctrl != null)
break;
}
return ctrl;
}
但是我有一个问题,我继承自SaveButton
,我无法引用控件。在那种情况下,我改变了,以便我继承FormControl
,我可以在this.Controls
下找到我的控制权。
另请注意,在OnLoad事件执行之前,您无法引用控件(即,如果您使用的是OnLoad函数,请在引用控件之前调用base.OnLoad(e)
。
为什么会这样?我想因为它不像你有一个模板然后代码背后(使用相同的类/对象),但它更像是在不同的类/目标文件中渲染ascx模板。