【问题标题】:User Control, everything yields null用户控制,一切都为空
【发布时间】:2011-07-17 16:00:00
【问题描述】:

我正在构建一个非常简单的 ASP.NET 用户控件,以借助 jQuery UI 样式显示消息。

为此,我构建了一个单独的 Web 项目,站点项目引用了该项目。
我在 web.config 中引用了它,如下所示:

<pages>
  <controls>
    <add tagPrefix="uc" namespace="Website.Main.UserControls" assembly="Website.Main.UserControls" />
  </controls>
</pages>

然后在一个测试页面中,我这样实例化它:

<uc:StatusMessage ID="Test" runat="server" Type="Help" Text="testing.." />

这是控件的代码

using System;

namespace Website.Main.UserControls
{
    public partial class StatusMessage : System.Web.UI.UserControl
    {
        public enum MessageType
        {
            Error,
            Notice,
            Help,
            Info,
            Success
        }

        public string Text
        {
            get { return Message.Text; }
            set
            {
                Message.Text = value;
            }
        }

        private MessageType _type;
        public MessageType Type
        {
            get { return _type; }
            set
            {
                _type = value;

                if (_type == MessageType.Error)
                {
                    MessageContainer.Attributes["class"] = "ui-icon ui-icon-alert";
                    MessageIcon.Attributes["class"] = "ui-state-error ui-corner-all";
                }
                else
                {
                    MessageIcon.Attributes["class"] = "ui-state-highlight ui-corner-all";

                    if (_type == MessageType.Notice)
                    {
                        MessageContainer.Attributes["class"] = "ui-icon ui-icon-notice";
                    }
                    else if (_type == MessageType.Help)
                    {
                        MessageContainer.Attributes["class"] = "ui-icon ui-icon-help";
                    }
                    else if (_type == MessageType.Info)
                    {
                        MessageContainer.Attributes["class"] = "ui-icon ui-icon-info";
                    }
                    else if (_type == MessageType.Success)
                    {
                        MessageContainer.Attributes["class"] = "ui-icon ui-icon-check";
                    }
                }
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        public void SetText(string text, MessageType type = MessageType.Info)
        {
            Text = text;
            Type = type;

            StatusMessagePanel.Update();
        }
    }
}

还有标记

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="StatusMessage.ascx.cs" Inherits="Website.Main.UserControls.StatusMessage" %>

<asp:UpdatePanel ID="StatusMessagePanel" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <div class="ui-widget">
            <div style="margin-top: 20px; padding-left: 7px; padding-top: 7px;" class="ui-state-highlight ui-corner-all" id="MessageContainer" runat="server"> 
                <p>
                    <span style="float: left; margin-top: 4px; margin-right: .3em;" class="ui-icon ui-icon-info" id="MessageIcon" runat="server"></span>
                    <asp:Label ID="Message" runat="server"></asp:Label>
                </p>
            </div>
        </div>
    </ContentTemplate>
</asp:UpdatePanel>

问题是,每当我得到这个控件的代码隐藏时,也就是说,当页面呈现并获取属性时,所有的 uc 成员都是null。即:MessageMessageContainerMessageIconStatusMessagePanel都是null

我不知道是什么导致了这种行为,我尝试删除更新面板但没有任何变化。

【问题讨论】:

  • 页面有缓存吗?
  • 您的 getter 没有检查 null 并提供默认值,而且我没有看到正在使用视图状态,因此需要在每次加载时设置属性。对不起,如果我错过了什么。我在手机上查看,看不到你的所有代码。

标签: c# asp.net user-controls


【解决方案1】:

使用 web.config 文件,您只能注册服务器 Web 控件。但是对于用户控件,您必须在使用这些控件的每个页面上添加注册标记。像这样:&lt;%@ Register TagPrefix="uc" TagName="StatusMessage " Src="~/UserControls/StatusMessage .ascx" %&gt;

【讨论】:

    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多