代码之家  ›  专栏  ›  技术社区  ›  Armstrongest

如何在asp.net页面上的一个位置处理所有错误/消息?

  •  2
  • Armstrongest  · 技术社区  · 15 年前

    我在这里找些指导。

    在我的网站上,我把东西放在web用户控件中。例如,我将有一个Newsitem控件、一个Article控件、一个ContactForm控件。

    这些将出现在我的网站的不同地方。

    我要寻找的是这些控件将消息传递到其所在页的方法。

    我不想把它们紧密地结合在一起,所以我想我必须在活动/代表中这样做。不过,我有点不清楚该如何实施。

    举几个例子:

    已提交联系人表单。提交后,与其用“your mail has been sent”(您的邮件已发送)替换自身,从而限制该邮件的位置,我只想通知页面,控件已打开,并显示一条状态消息,可能还有建议的行为。因此,消息将包括要呈现的文本以及 enum 喜欢 DisplayAs.Popup DisplayAs.Success

    项目控件查询数据库中的项目对象。数据库返回异常。自定义异常与 DisplayAs.Error 枚举。页面处理此错误,并在错误出现的任何位置显示它。

    我正在尝试实现类似于validationSummary控件的功能,只是希望页面能够在枚举合适时显示消息。

    同样,我不想紧密绑定或依赖页面上现有的控件。我希望控件引发这些事件,但如果页面愿意,可以忽略它们。

    我这样做对吗?

    我想要一个 code 样本只是为了让我开始。

    我知道这是一个更复杂的问题,所以在投票/选择答案之前我会等更长的时间。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Win    15 年前

    您可以在子页到父页中弹出事件。父页可以注册该事件并利用它(如果它有用的话)。

    父aspx

    <uc1:ChildControl runat="server" ID="cc1" OnSomeEvent="cc1_SomeEvent" />
    

    母公司C#

    protected void cc1_SomeEvent(object sender, EventArgs e)
    {
        // Handler event
    }
    

    儿童C#

    public event EventHandler OnSomeEvent;
    
    protected void ErrorOccurInControl()
    {
         if (this.OnSomeEvent != null)
         {
              this.OnSomeEvent(this, new EventArgs());
         }
    }
    
    protected override void OnLoad(EventArgs e)
    {
         ErrorOccurInControl();
    }
    
        2
  •  2
  •   Glennular    15 年前

    下面假设您知道控件都放在 App.YourPage

    这里有一个快速消息框,我把它放在母版页或页面上,只需要从任何页面或控件调用。(抱歉,它在vb.net中不是c)

    您可以将addMessage扩展到日志并执行其他基于事务的操作(我从中提取了控制器逻辑)

    从任何控制:

    CType(Page, App.YourPage).messageBox.AddMessage(
             ctrlMessageBox.MessageTypes.InfoMessage
              ,"Updated Successfully")
    

    控制:

        Public Class ctrlMessageBox
            Inherits System.Web.UI.UserControl
    
            'List of types that a message could be
            Enum MessageTypes
                InfoMessage
                ErrorMessage
                WarningMessage
            End Enum
    
    #Region "[Message] inner class for structered message object"
            Public Class Message
                Private _messageText As String
                Private _messageType As MessageTypes
                Public Property MessageText() As String
                    Get
                        Return _messageText
                    End Get
                    Set(ByVal value As String)
                        _messageText = value
                    End Set
                End Property
                Public Property MessageType() As MessageTypes
                    Get
                        Return _messageType
                    End Get
                    Set(ByVal value As MessageTypes)
                        _messageType = value
                    End Set
                End Property
    
            End Class
    #End Region
    
            'storage of all message objects
            Private _messages As New List(Of Message)
    
            'Creates a Message object and adds it to the collection
            Public Sub addMessage(ByVal MessageType As MessageTypes, ByVal MessageText As String)
                Page.Trace.Warn(Me.GetType.Name, String.Format("addMessage({0},{1})", MessageType.ToString, MessageText))
                Dim msg As New Message
                msg.MessageText = MessageText
                msg.MessageType = MessageType
                _messages.Add(msg)
            End Sub
    
            Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
                ' Page.Trace.Warn(Me.GetType.Name, String.Format("Page_PreRender(_messages.Count={0})", _messages.Count))
    
            End Sub
            Public Overrides Sub RenderControl(ByVal writer As System.Web.UI.HtmlTextWriter)
                Page.Trace.Warn(Me.GetType.Name, String.Format("ctrlMessageBox.RenderControl(_messages.Count={0})", _messages.Count))
                'draws the message box on the page with all messages
    
                If _messages.Count = 0 Then Return
                Dim sbHTML As New StringBuilder
                sbHTML.Append("<div id='MessageBox'>")
    
                For Each msg As Message In _messages
                    sbHTML.AppendFormat("<p><img src='{0}'> {1}</p>", getImage(msg.MessageType), msg.MessageText)
                Next
    
                sbHTML.Append("</div>")
    
                writer.Write(sbHTML.ToString)
    
                'dim ctrlLiteral As New Literal()
                'ctrlLiteral.Text = sbHTML.ToString
                'Me.Controls.Add(ctrlLiteral)
            End Sub
    
            'returns a specific image based on the message type
            Protected Function getImage(ByVal type As MessageTypes) As String
                Select Case type
                    Case MessageTypes.ErrorMessage
                        Return Page.ResolveUrl("~/images/icons/error.gif")
                    Case MessageTypes.InfoMessage
                        Return Page.ResolveUrl("~/images/icons/icon-status-info.gif")
                    Case MessageTypes.WarningMessage
                        Return Page.ResolveUrl("~/images/icons/icon-exclaim.gif")
                    Case Else
                        Return ""
                End Select
            End Function
        End Class
    
        3
  •  1
  •   Keith Adler    15 年前

    数据注释验证器非常适合这种类型的事情。它们通常在asp.net mvc中使用,但在webforms中工作得很好。您可以使用内置的验证器或创建自己的自定义验证器来执行更复杂的验证。

    此示例位于vb.net中,但您不难看到其值:

    http://adventuresdotnet.blogspot.com/2009/08/aspnet-webforms-validation-with-data.html

    http://blogs.microsoft.co.il/blogs/gilf/archive/2010/04/08/building-asp-net-validator-using-data-annotations.aspx