渲染newform和代码的模板

时间:2011-08-01 14:47:21

标签: asp.net forms sharepoint sharepoint-2010 code-behind

我正在尝试为需要复杂验证处理的表单创建渲染模板。 渲染模板正常运行:

<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,因为没有映射。

我错过了什么吗?

1 个答案:

答案 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模板。