Пользовательские элементы управления ASP.NET - пользовательское свойство не содержит назначенное значение при обратной передаче - PullRequest
2 голосов
/ 13 января 2012

У меня есть пользовательский элемент управления asp-net, который наследуется от другого и работает как положено, хотя свойства устанавливаются правильно только в том случае, если я кодирую их непосредственно в разметке, например, если мне нужно установить свойство во время выполнения, чтобыявляется некоторым динамическим значением, это значение никогда не устанавливается или каким-либо образом теряется.

Вот код разметки:

<!--related form-->
<fw:advancedformdisplay id="formDisp" runat="server" captchaenabled="true" EmailEnabled="true" EnableViewState="true" captchaprivatekey="xxxxxxxxxxxxxxxxxxxx" captchapublickey="xxxxxxxxxxxxx" captchatheme="white" SourceType="MenuItem" SourceMainId="Auto">
</fw:advancedformdisplay> 

Это код элемента управления:

    [DefaultProperty("CaptchaEnabled"),ToolboxData("<{0}:AdvancedFormDisplay runat=server></{0}:AdvancedFormDisplay>"), Description("This is an enhanced FormDisplay control that inlcudes Googles Captcha control is enabled")]
public class AdvancedFormDisplay :SiteBuilder.WebControls.FormDisplay
{
    bool _CaptchaEnabled = false, sendEmail = false;
    string captchaErrorMessage = "The verification code entered is not valid. Please try again!";
    RecaptchaControl captchaControl = null;
    string captchaPrivateKey = "", captchaPublicKey = "", captchaTheme = "clean";
    string originalFormHtml = string.Empty;
    string afterText = string.Empty, beforeText = string.Empty;
    Literal litHtmlForm = null;
    string captchaErrorClass = "errorCaptcha";

    public string EmailBeforeText
    {
        get { return beforeText; }
        set { beforeText = value; }
    }

    public string EmailAfterText
    {
        get { return afterText; }
        set { afterText = value; }
    }

    public string CaptchaErrorClass
    {
        get { return captchaErrorClass; }
        set { captchaErrorClass = value; }
    }

    public bool CaptchaEnabled
    {
        get { return _CaptchaEnabled; }
        set { _CaptchaEnabled = value; }
    }

    public bool EmailEnabled
    {
        get { return sendEmail; }
        set { sendEmail = value; }
    }

    public string CaptchaErrorMessage
    {
        get { return captchaErrorMessage; }
        set { captchaErrorMessage = value; }
    }

    /// <summary>
    /// red,white,blackglass,clean
    /// </summary>
    public string CaptchaTheme
    {
        get { return captchaTheme; }
        set { captchaTheme = value; }
    }

    public string CaptchaPrivateKey
    {
        get { return captchaPrivateKey; }
        set { captchaPrivateKey = value; }
    }

    public string CaptchaPublicKey
    {
        get { return captchaPublicKey; }
        set { captchaPublicKey = value; }
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
    }


    public override void OnSaved(FormDisplayEventArgs e)
    {
        //If captcha control is enabled we need to adda  bit of code to redirect form properly
        if (CaptchaEnabled && e.Redirect && !e.SendMail)
        {
            //Do Stuff
        }

        if(sendEmail)
        {
            //Send email
        }

        base.OnSaved(e);
    }

    public override void OnSaving(FormDisplayEventArgs e)
    {
        if (CaptchaEnabled)
        {
            //Validate and do stuff
        }

        base.OnSaving(e);
    }
}

А затем на моей странице asp.net, которая использует элемент управления, созданный кодом разметки, в Page_Load () я пытаюсь присвоить некоторые значения некоторым свойствам, и значения не устанавливаются должным образом, что означает, что если я установил дляisntance, свойство EmailBeforeText = "somthing", этому значению не будет присвоено ..

protected void Page_Load(object sender, EventArgs e)
{
    //2: Get the language of menuitem - Based on current culture setting (for by dropdownbox - change logic)
    try
    {
        currentCulture = Thread.CurrentThread.CurrentCulture.ToString();

        // Redirect if domain does not match rootnode.
        DomainChecker.CheckURL(this.Request, this.Response, currentCulture);

        if (footerArticle != null)
            footerArticle.SourceMenuId = Digimaker.Config.Custom.Get("FooterID_" + currentCulture).ToString();
    }
    catch
    {
        currentCulture = "en-GB";

        if( footerArticle != null )
            footerArticle.SourceMenuId = Digimaker.Config.Custom.Get("FooterID_" + currentCulture).ToString();
    }

Есть идеи, что мне здесь не хватает?

Большое спасибо за чтение!

С уважением, byte_slave

1 Ответ

1 голос
/ 13 января 2012

краткий ответ: используйте viewstate, чтобы сохранить ваши пользовательские значения!

редактировать: чтение белой книги, очевидно, действительно сложная вещь:

Каждый элемент управления отвечает за сохранение своего собственного состояния, которое достигается путем добавления его измененного состояния к свойству ViewState. Свойство ViewState определено в классе System.Web.UI.Control, Это означает, что все серверные элементы управления ASP.NET имеют это свойство доступным. (Говоря о состоянии просмотра в целом, я буду использовать строчные буквы с пробелом между видом и состоянием; при обсуждении ViewState свойство, я буду использовать правильный регистр и форматированный код.)

Если вы изучите простые свойства любого серверного элемента управления ASP.NET вы увидите, что свойства читают и пишут прямо в представление государство. (Вы можете просмотреть декомпилированный исходный код сборки .NET, выполнив используя такой инструмент, как Reflector.) Например, рассмотрим HyperLink Web свойство NavigateUrl элемента управления. Код для этого свойства выглядит так:

public string NavigateUrl
{
  get
  {
    string text = (string) ViewState["NavigateUrl"];
    if (text != null)
       return text;
    else
       return string.Empty;
  }
  set
  {
    ViewState["NavigateUrl"] = value;
  }
}

Как показывает этот пример кода, всякий раз, когда свойство элемента управления прочитайте, ViewState элемента управления консультируется. Если нет записи в ViewState возвращается значение по умолчанию для свойства. Когда свойство назначено, назначенное значение записывается непосредственно в ViewState.

...