SubForm Not Found ?

This post has 13 Replies | 3 Followers

Top 500 Contributor
Posts 61
Points 680
marty1101 Posted: Wed, Jun 25 2008 5:10 AM

PS. I have read all posts and articles about subforms.

It took me two days on debugging this.  These is still no way out.  Please help!!

1. In /theme/default/createuser.aspx,

I added a subform [SubFormIds="SaveLanguageSubform"] in <CSControl:CreateUserForm .  The subform looks like this:

                                <custom:SaveLanguageSubForm runat="server" ID="SaveLanguageSubForm" LanguageDropDownListId="LanguageDDL">
                                    <FormTemplate>
                                        <asp:DropDownList id="LanguageDDL" runat="server" />
                                    </FormTemplate>
                                </custom:SaveLanguageSubForm>

and <%@ Register Namespace="CS.Custom.Controls" TagPrefix="custom" %> is on the top of the page.

2. The SaveLanguageSubForm class is defined in App_Code folder under CS.Custom.Controls namespace.

3. The createuser.aspx works and can create a new user, but ApplyChangesAfterCommit() in the SaveLanguageSubForm class doesn't get to run at all!!!   I want to copy the anonymous user's filterLanguages into the created user's filterLanguages settings in this function. but ......

 

After two days' tracing, I found where the problem is: the SaveLanguageSubForm subform can not be found by this line of code: " WrappedSubFormBase subForm = CSControlUtility.Instance().FindControl(this, id) as WrappedSubFormBase;".  This line is in the source code (2007.1) \Controls\Forms\CreateUserForm.cs at around Line 194.  "id" is the subform's ID.

When there is no subform, subForm.ApplyChangesAfterCommit(user) does not run.

Guesses:

1. CSControlUtility.Instance().FindControl(this, id) can not find the subform ID because it is defined as <custom:SaveLanguageSubForm>.  In other CS's subforms, it is defined as <CSControl:AvatarSubForm> for example.  but I don't know how to mimic it.

2. There is something wrong with my createuser.aspx or \App_Code\SaveLanguageSubForm.cs


HELP~~

 

CREATEUSER.ASPX ======================================================

<%@ Page EnableViewState="false" Language="C#" AutoEventWireup="true" Inherits="CommunityServer.Controls.CSThemePage" MasterPageFile="../Common/master.Master" %>
<%@ Import Namespace="CommunityServer.Components" %>
<%@ Register Namespace="CS.Custom.Controls" TagPrefix="custom" %>

<script language="C#" runat="server">

    void Page_Load()
    {
        SetTitle(ResourceManager.GetString("CreateNewAccount_Title"), true);
    }

</script>

<asp:Content ContentPlaceHolderID="bcr" runat="server">

<div align="center">
<div class="CommonContentArea" style="width:650px;">
<h2 class="CommonTitle">
    <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_Title" />
</h2>

<div class="CommonContent">
<div class="CommonFormArea" >

<div class="CommonFormFieldDescription"><CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_Instructions" ID="Resourcecontrol8"/></div>

<CSControl:CreateUserForm runat="server"
    AcceptAgreementCheckBoxId="AcceptAgreement"
    AcceptAgreementHyperLinkId="AcceptAgreementLink"
    AllowSitePartnersToContactCheckBoxId="AllowSitePartnersToContact"
    AllowSiteToContactCheckBoxId="AllowSiteToContact"
    CreateButtonId="CreateAccount"
    CreateUserCustomValidatorId="CreateUserCustomValidator"
    SubFormIds="SaveLanguageSubform"
    EmailAddressTextBoxId="Email"
    PasswordTextBoxId="Password"
    TimeZoneDropDownListId="Timezone"
    UserNameTextBoxId="Username"
    >

    <FormTemplate>
   
        <div align="center">
            <div class="CommonMessageArea" style="width: 100%;">
                <h4 class="CommonMessageTitle">
               
                    <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_Required">
                        <DisplayConditions runat="server">
                            <CSControl:Conditions Operator="not" runat="server">
                                <CSControl:SiteSettingsPropertyValueComparison ComparisonProperty="AccountActivation" Operator="EqualTo" ComparisonValue="Email" runat="server" />
                            </CSControl:Conditions>
                        </DisplayConditions>
                    </CSControl:ResourceControl>

                    <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_Required_ForEmailActivation">
                        <DisplayConditions runat="server">
                            <CSControl:SiteSettingsPropertyValueComparison ComparisonProperty="AccountActivation" Operator="EqualTo" ComparisonValue="Email" runat="server" />
                        </DisplayConditions>
                    </CSControl:ResourceControl>
                   
                </h4>
               
                <div class="CommonMessageContent">
                   <table cellpadding="0" cellspacing="0" border="0">
                  
                        <tr>
                            <td class="CommonFormFieldDescription" align="left" colspan="2">
                                <asp:CustomValidator runat="server" ID="CreateUserCustomValidator" />
                            </td>
                        </tr>
                       
                        <tr>
                            <td class="CommonFormFieldName" valign="top">
                                <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_UserName" />
                            </td>
                           
                            <td class="CommonFormField">
                                <asp:TextBox id="Username" MaxLength="64" runat="server" columns="40" />
                                <asp:RequiredFieldValidator EnableClientScript="false" id="usernameValidator" runat="server" ControlToValidate="Username" Cssclass="validationWarning">***</asp:RequiredFieldValidator>
                                <br />
                                <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_UserName_Description" />
                            </td>
                           
                        </tr>
                       
                        <CSControl:PlaceHolder runat="server">
                            <DisplayConditions Operator="Or" runat="server">
                           
                                <CSControl:Conditions runat="server" Operator="Not">
                                    <CSControl:SiteSettingsPropertyValueComparison ComparisonProperty="AccountActivation" ComparisonValue="Email" runat="server" Operator="EqualTo" />
                                </CSControl:Conditions>                       
                               
                                <CSControl:UserInRoleCondition runat="server" UseAccessingUser="true" Role="SystemAdministrator" />
                               
                                <CSControl:UserInRoleCondition runat="server" UseAccessingUser="true" Role="MembershipAdministrator" />
                               
                            </DisplayConditions>
                           
                            <ContentTemplate>
                           
                                <tr>
                                    <td class="CommonFormFieldName" valign="top">
                                            <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_PasswordDescription" />
                                    </td>

                                    <td class="CommonFormField">
                                            <asp:TextBox id="Password" MaxLength="64" TextMode="Password" runat="server" columns="40" />
                                            <asp:RequiredFieldValidator id="passwordValidator" runat="server" ControlToValidate="Password" Cssclass="validationWarning">***</asp:RequiredFieldValidator>
                                    </td>
                                   
                                </tr>
                               
                                <tr>
                               
                                    <td class="CommonFormFieldName" valign="top">
                                            <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_ReEnterPassword" />
                                    </td>
                                   
                                    <td class="CommonFormField">
                                            <asp:TextBox id="Password2" MaxLength="64" TextMode="Password" runat="server" columns="40" />
                                            <asp:RequiredFieldValidator id="password2Validator" runat="server" ControlToValidate="Password2" Cssclass="validationWarning">***</asp:RequiredFieldValidator>
                                            <asp:comparevalidator id="ComparePassword" runat="server" ControlToValidate="Password2" ControlToCompare="Password" Cssclass="validationWarning">***</asp:comparevalidator>
                                    </td>
                                   
                                </tr>
                               
                            </ContentTemplate>
                           
                        </CSControl:PlaceHolder>
                       
                        <tr>

                            <td class="CommonFormFieldName" valign="top">
                                <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_Email" />
                            </td>

                            <td>
                                <div class="CommonFormField">
                                    <asp:TextBox id="Email" runat="server" MaxLength="128" columns="40" />
                                    <asp:RequiredFieldValidator id="emailValidator" runat="server" ControlToValidate="Email" Cssclass="validationWarning">***</asp:RequiredFieldValidator>
                                    <br />
                                    <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_EmailDescription" ID="Resourcecontrol6"/>
                                </div>
                            </td>
                           
                        </tr>
                       
                        <tr>
                            <td class="CommonFormFieldName" valign="top">
                                <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_ReEnterEmail" />
                            </td>
                           
                            <td class="CommonFormField">
                                    <asp:TextBox id="Email2" runat="server" MaxLength="128" columns="40" />
                                    <asp:RequiredFieldValidator id="email2Validator" runat="server" ControlToValidate="Email2" Cssclass="validationWarning">***</asp:RequiredFieldValidator>
                                    <asp:comparevalidator id="CompareEmail" runat="server" ControlToValidate="Email2" ControlToCompare="Email" Cssclass="validationWarning">***</asp:comparevalidator>
                                    <br />
                                    <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_EmailDescription_ReEnter" ID="Resourcecontrol1"/>
                            </td>
                        </tr>

                        <tr>
                            <td class="CommonFormFieldName" valign="top">
                                <CSControl:ResourceControl runat="server" ResourceName="CreateNewAccount_Language" />
                            </td>

                            <td class="CommonFormField">
                                <custom:SaveLanguageSubForm runat="server" ID="SaveLanguageSubForm" LanguageDropDownListId="LanguageDDL">
                                    <FormTemplate>
                                        <asp:DropDownList id="LanguageDDL" runat="server" />
                                    </FormTemplate>
                                </custom:SaveLanguageSubForm>
                            </td>
                        </tr>
                       
                        <tr>
                       
                            <td class="CommonFormFieldName" valign="top">
                                <CSControl:ResourceControl runat="server" resourcename="CreateNewAccount_Timezone" />
                            </td>
                           
                            <td class="CommonFormField">
                                    <asp:DropDownList id="Timezone" runat="server" />
                            </td>
                           
                        </tr>
                       
                        <CSControl:PlaceHolder runat="server">
                       
                            <DisplayConditions runat="server"><CSControl:SiteSettingsPropertyValueComparison runat="server" ComparisonProperty="ShowContactCheckboxes" Operator="IsSetOrTrue" /></DisplayConditions>
                           
                            <ContentTemplate>

                                <tr>

                                    <td class="CommonFormFieldName">
                                        <CSControl:ResourceControl runat="server" resourcename="CreateNewAccount_AllowSiteToContact" />
                                    </td>

                                    <td    class="CommonFormField">
                                            <asp:CheckBox id="AllowSiteToContact" runat="server" />
                                    </td>

                                </tr>

                                <tr>

                                    <td class="CommonFormFieldName">
                                        <CSControl:ResourceControl runat="server" resourcename="CreateNewAccount_AllowSitePartnersToContact" />
                                    </td>

                                    <td class="CommonFormField">
                                            <asp:CheckBox id="AllowSitePartnersToContact" runat="server" />
                                    </td>

                                </tr>

                            </ContentTemplate>

                        </CSControl:PlaceHolder>
                       
                        <CSControl:PlaceHolder runat="server">
                          
                            <DisplayConditions runat="server"><CSControl:SiteSettingsPropertyValueComparison runat="server" ComparisonProperty="TermsOfServiceUrl" Operator="IsSetOrTrue" /></DisplayConditions>
                         
                            <ContentTemplate>
                                <tr>
                        
                                    <td class="CommonFormFieldName">
                                        <CSControl:ResourceControl runat="server" resourcename="CreateNewAccount_ForumRules" />
                                    </td>
                        
                                    <td class="CommonFormField">
                                        <asp:CheckBox id="AcceptAgreement" Runat="server" onclick="validateForm(this);" /><asp:HyperLink runat="server" id="AcceptAgreementLink"  />
                                        <CSControl:SiteSettingsData LinkTo="TermsOfService" LinkTarget="_blank" ResourceName="CreateNewAccount_ForumRulesDesc" runat="server" />
                                        <CSControl:RequiredCheckBoxValidator EnableClientScript="false" id="RequiredAcceptAgreement" runat="server" ControlToValidate="AcceptAgreement" Cssclass="validationWarning">***</CSControl:RequiredCheckBoxValidator>
                                    </td>
                        
                                </tr>
                            </ContentTemplate>

                        </CSControl:PlaceHolder>

                    </table>

                    <div style="text-align: center; margin-top: 16px;">
                        <CSControl:ResourceLinkButton ResourceName="CreateNewAccount_CreateAccount" CssClass="CommonTextButton Big" id="CreateAccount" Runat="server" />
                    </div>

                </div>

            </div>

        </div>
    </FormTemplate>
</CSControl:CreateUserForm>

</div>
</div>
</div>
</div>

</asp:Content>

CREATEUSER.ASPX ======================================================

 

 

 

SaveLanguageSubForm.cs ======================================================

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using CommunityServer;
using CommunityServer.Components;
using CommunityServer.Controls;

/// <summary>
/// source:  http://communityserver.org/forums/p/497896/614869.aspx#614869 , http://dev.communityserver.com/forums/p/481834/587628.aspx#587628
/// used in Createuser.aspx
/// </summary>

namespace CS.Custom.Controls
{
    public class SaveLanguageSubForm : WrappedSubFormBase
    {

        #region Child Controls
        DropDownList LanguageDropDownList;
        #endregion

        #region Properties

        public string LanguageDropDownListId
        {
            get { return (string)ViewState["LanguageDropDownListId"] ?? string.Empty; }
            set { ViewState["LanguageDropDownListId"] = value; }
        }

        public override object DataSource
        {
            get
            {
                return base.DataSource;
            }
            set
            {
                if (value is User || value == null)
                    base.DataSource = value;
                else
                    throw new InvalidCastException("DataSource must be a valid User object");
            }
        }

        #endregion

        #region Attach Child Controls

        protected override void AttachChildControls()
        {
            LanguageDropDownList = CSControlUtility.Instance().FindControl(this, LanguageDropDownListId) as DropDownList;
            if (LanguageDropDownList != null)
                CSControlUtility.Instance().PopulateWithLanguages(LanguageDropDownList);
            LanguageDropDownList.Enabled = true;
            LanguageDropDownList.SelectedValue = CSContext.Current.User.Profile.Language;
        }

        #endregion

        #region DataBind

        public override void DataBind()
        {
            base.DataBind();
        }

        #endregion

        #region Event Handlers

        public override void ApplyChangesAfterCommit(object activeObject)
        {
            EnsureChildControls();

            string username = CSContext.Current.User.Username;
            User this_anonymous_user = Users.FindUserByUsername(username);
            string filterLanguages = this_anonymous_user.GetExtendedAttribute("filterLanguages");

            base.ApplyChangesAfterCommit(activeObject);

            if (this.HostForm is CreateUserForm && activeObject is User)
            {
                User userToEdit = Users.GetUserWithWriteableProfile();
                userToEdit.ClearFilterLanguagesToExclude();

                if (!Globals.IsNullorEmpty(filterLanguages))
                {
                    string[] sa = filterLanguages.Split(',');
                    foreach (string s in sa)
                    {
                        userToEdit.AddFilterLanguageToExclude(s);
                    }
                }
                Users.UpdateUser(userToEdit);
            }

        }

        #endregion

        public override bool IsEnabled()
        {
            return true;
        }

    }

}

SaveLanguageSubForm.cs ======================================================

 

Top 150 Contributor
Posts 165
Points 4,735

Just a quick question, is the <custom:SaveLanguageSubForm  nested inside the FormTemplate of the CreateUser form?

Rob

Four Roads News

  • | Post Points: 20
Top 500 Contributor
Posts 61
Points 680
marty1101 replied on Wed, Jun 25 2008 5:23 AM

 

Yes!   Would this the real reason?  I didn't figure out how to move it out of the FormTemplate of the CreateUser form ....

I have posted the code. 

but .....

In the original edituser.aspx, the <CSControl:UserAvatarSubForm  is nested in the FormTemplate of <CSControl:EditUserForm

the UserAvatarSubForm can be found by CSControl.Instance().Findcontrol(this, id) though.

The same applies to :

In createeditentry.aspx:

<CSFile:CreateEditEntryForm

<FormTemplate>

         <CSFile:EntryTagsSubForm

                  <FormTemplate>

                  </FormTemplate>

         </CSFile:EntryTagsSubForm>

</FormTemplate>

</CSFile:CreateEditEntryForm>

In createeditpost.aspx:

<CSForum:CreateEditForumPostForm

<FormTemplate>

         <CSForum:PostTagsSubForm

                  <FormTemplate>

                  </FormTemplate>

         </CSForum:PostTagsSubForm

         <CSForum:PostAttachmentSubForm

                  <FormTemplate>

                  </FormTemplate>

         </CSForum:PostAttachmentSubForm

         <CSForum:PostInkSubForm

                  <FormTemplate>

                  </FormTemplate>

         </CSForum:PostInkSubForm

         <CSForum:PostVideoSubForm

                  <FormTemplate>

                  </FormTemplate>

         </CSForum:PostVideoSubForm

         <CSForum:PostPollSubForm

                  <FormTemplate>

                  </FormTemplate>

         </CSForum:PostPollSubForm

</FormTemplate>

  • | Post Points: 20
Top 150 Contributor
Posts 165
Points 4,735

Inside the FormTemplate tag is correct.  I can't see any thing obviously wrong with your code and would need to debug it to see whats going on. 

Sorry,
Rob

Four Roads News

  • | Post Points: 20
Top 500 Contributor
Posts 61
Points 680
marty1101 replied on Wed, Jun 25 2008 10:39 AM

A few more twickings, I found these is something wrong with \App_Code\SaveLanguageSubForm.cs

I added a SuccessAction subform from http://dev.communityserver.com/forums/p/481834/587628.aspx#587628 and it works.  This subform can be found.

so, I would need to re-examin this:  public class SaveLanguageSubForm : WrappedSubFormBase

.......................

  • | Post Points: 5
Top 10 Contributor
Posts 3,059
Points 45,430
TelligentSupportTeam
Alex Crome replied on Wed, Jun 25 2008 12:32 PM

Have a look at your code again

SubFormIds="SaveLanguageSubform"

<custom:SaveLanguageSubForm runat="server" ID="SaveLanguageSubForm" LanguageDropDownListId="LanguageDDL">

The CreateUser control is looking for the "SaveLanguageSubform", but no such control exists.  There is a control called "SaveLanguageSubForm", but that's a different control.  Change your code so both match and you'll be good to go.

  • | Post Points: 50
Top 150 Contributor
Posts 165
Points 4,735

Ahh sharp eyes well done!

Four Roads News

  • | Post Points: 5
Top 500 Contributor
Posts 61
Points 680
marty1101 replied on Wed, Jun 25 2008 10:16 PM

Thank you, afscrome.  First thing in the morning seeing your thankful reply, I had great hope to solve this annoying issue, but found it has been corrected in last night's efforts of adding the SuccessActionSubForm.  Still, SaveLanguageSubForm is not found, but SuccessActionSubForm is found.  I was hoping this would have been solved this morning, but .....  oh no, more scratching on my head.

SaveLanguageSubForm.cs     [blockquote]

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.ComponentModel;
using CommunityServer;
using CommunityServer.Components;
using CommunityServer.Controls;

/// <summary>
/// source:  http://communityserver.org/forums/p/497896/614869.aspx#614869 , http://dev.communityserver.com/forums/p/481834/587628.aspx#587628
/// used in Createuser.aspx
/// </summary>

namespace marty1101
{
    public class SuccessActionSubForm : WrappedSubFormBase
    {

        private Actions _successActions;
        [Browsable(false),
        DefaultValue(null),
        Description("Defines the actions to take when a form completes successfully"),
        PersistenceMode(PersistenceMode.InnerProperty)]
        public virtual Actions SuccessActions
        {
            get { return _successActions; }
            set
            {
                if (_successActions != null)
                    this.Controls.Remove(_successActions);

                _successActions = value;
                if (_successActions != null)
                    this.Controls.Add(_successActions);
            }
        }

        protected override void AddPropertyControls()
        {
            if (this.SuccessActions != null)
                this.Controls.Add(this.SuccessActions);

            base.AddPropertyControls();
        }

        public override bool IsEnabled()
        {
            return true;
        }

        protected override void AttachChildControls() {  }

        public override void ApplyChangesAfterCommit(object activeObject)
        {
            base.ApplyChangesAfterCommit(activeObject);

            if (this.HostForm is CreateUserForm && activeObject is User)
            {
                CSContext csContext = CSControlUtility.Instance().GetCurrentCSContext(this.Page);
                User user = (User)activeObject;

                if (csContext.SiteSettings.AllowLogin)
                    if (!Page.Request.IsAuthenticated)
                        System.Web.Security.FormsAuthentication.SetAuthCookie(user.Username, true);
            }

            if (this.SuccessActions != null)
                this.SuccessActions.Execute(this, activeObject);
        }

    }

    public class SaveLanguageSubForm : WrappedSubFormBase
    {

        #region Child Controls
        DropDownList LanguageDropDownList;
        #endregion

        #region Properties

        public string LanguageDropDownListId
        {
            get { return (string)ViewState["LanguageDropDownListId"] ?? string.Empty; }
            set { ViewState["LanguageDropDownListId"] = value; }
        }

        public override object DataSource
        {
            get
            {
                return base.DataSource;
            }
            set
            {
                if (value is User || value == null)
                    base.DataSource = value;
                else
                    throw new InvalidCastException("DataSource must be a valid User object");
            }
        }

        #endregion

        #region Attach Child Controls

        protected override void AttachChildControls()
        {
            LanguageDropDownList = CSControlUtility.Instance().FindControl(this, LanguageDropDownListId) as DropDownList;
            if (LanguageDropDownList != null)
                CSControlUtility.Instance().PopulateWithLanguages(LanguageDropDownList);
            LanguageDropDownList.Enabled = true;
            LanguageDropDownList.SelectedValue = CSContext.Current.User.Profile.Language;
        }

        #endregion

        #region DataBind

        public override void DataBind()
        {
            base.DataBind();
/*
                        if (!Page.IsPostBack)
                        {
                            marty1101.AnonymousCookie guestCookie = new marty1101.AnonymousCookie();
                            string userLanguage = guestCookie.GetLanguage();
                            if (LanguageDropDownList != null && LanguageDropDownList.Items.FindByValue(userLanguage) != null)
                                LanguageDropDownList.Items.FindByValue(userLanguage).Selected = true;
                        }
*/
/*
            foreach (WrappedSubFormBase subForm in this.SubForms)
            {
                subForm.DataSource = this.DataSource;
                subForm.DataBind();
            }
*/
        }

        #endregion

        #region Event Handlers

        public override void ApplyChangesAfterCommit(object activeObject)
        {
//            EnsureChildControls();

            string username = CSContext.Current.User.Username;
            User this_anonymous_user = Users.FindUserByUsername(username);
            string filterLanguages = this_anonymous_user.GetExtendedAttribute("filterLanguages");

            base.ApplyChangesAfterCommit(activeObject);

            if (this.HostForm is CreateUserForm && activeObject is User)
            {
                User userToEdit = Users.GetUserWithWriteableProfile();
                userToEdit.ClearFilterLanguagesToExclude();

                if (!Globals.IsNullorEmpty(filterLanguages))
                {
                    string[] sa = filterLanguages.Split(',');
                    foreach (string s in sa)
                    {
                        userToEdit.AddFilterLanguageToExclude(s);
                    }
                }
                Users.UpdateUser(userToEdit);
            }

        }

        #endregion

        public override bool IsEnabled()
        {
            return true;
        }

    }

}

[/blockquote]

 

 

createuser.aspx   [blockquote]

<%@ Page EnableViewState="false" Language="C#" AutoEventWireup="true" Inherits="CommunityServer.Controls.CSThemePage" MasterPageFile="../Common/master.Master" %>
<%@ Import Namespace="CommunityServer.Components" %>
<%@ Import Namespace="System.Web.UI.Web