【问题标题】:Rendering template for newform and code behind新表单和代码的渲染模板
【发布时间】:2013-08-06 01:32:01
【问题描述】:

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

<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 页面中那样被调用,即使在开头使用 也是如此。 但是每个事件都有效:

 <asp:Button runat="server" ID="button" OnClick="button_OnClick"/>

这实际上会在我后面的代码中调用 button_OnClick。但是我所有的属性都是空的,因为没有映射。

我错过了什么吗?

【问题讨论】:

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


    【解决方案1】:

    我一直是这样的。以这个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>
    

    然后在渲染事件中我可以像这样引用这些控件:

        [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 模板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 2017-06-19
      • 2019-11-19
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      相关资源
      最近更新 更多