Шаблон рендеринга для новой формы и кода - PullRequest
1 голос
/ 01 августа 2011

Я пытаюсь создать шаблон рендеринга для моих форм, которые требуют сложных процедур проверки.шаблон рендеринга работает нормально с:

<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">

.....

, но у меня не может быть никаких отображений элементов управления в моем коде позади (в бункере webapp сполитики cas, и она правильно развернута) это:

  <asp:TextBox runat="server" ID="test"></asp:TextBox>

равно нулю, когда дело доходит до:

 public partial class ChaisTemplate : System.Web.UI.UserControl 
{
    protected TextBox test;

поэтому каждый раз, когда я вызываю test.Text для функций, я получаю исключение nullreferenceexception,потому что тест никогда не отображается в моем текстовом поле ascx.Зачем ?Кроме того, PageLoad никогда не вызывается, как на классических страницах asp.net, даже с <% PageLoad (this, null);%> в начале.однако каждое событие работает:

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

это фактически вызовет button_OnClick в моем коде позади.Но все мои свойства равны нулю, потому что не отображаются.

я что-то пропустил?

1 Ответ

0 голосов
/ 08 сентября 2011

Я делал это так.Возьмите это в качестве примера

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 в другом файле класса / объекта.

...