Как я могу обработать все мои ошибки / сообщения в одном месте на странице Asp.Net? - PullRequest
2 голосов
/ 07 мая 2010

Я ищу руководство здесь.

На своем сайте я помещаю вещи в веб-элементы управления. Например, у меня будет элемент управления NewsItem, элемент управления Article, элемент управления ContactForm.

Они появятся в разных местах на моем сайте.

То, что я ищу, - это способ для этих элементов управления передавать сообщения на страницу, на которой они существуют.

Я не хочу тесно связывать их, поэтому я думаю, что мне придется сделать это с Событиями / Делегатами. Мне немного неясно, как бы я это реализовал.

Пара примеров:

1

Форма обратной связи отправлена. После того, как оно будет отправлено, вместо того, чтобы заменить себя «Вашим письмом было отправлено», которое ограничивает размещение этого сообщения, я хотел бы просто уведомить страницу о включенном элементе управления с сообщением о состоянии и, возможно, с предложенным поведением. Таким образом, сообщение должно содержать текст для отображения, а также enum, например DisplayAs.Popup или DisplayAs.Success

.

2

Элемент управления Article запрашивает базу данных для объекта Article. База данных возвращает исключение. Пользовательское исключение передается на страницу вместе с перечислением DisplayAs.Error. Страница обрабатывает эту ошибку и отображает ее везде, где ошибки.

Я пытаюсь выполнить что-то похожее на элемент управления ValidationSummary, за исключением того, что я хочу, чтобы страница могла отображать сообщения, когда перечисление кажется подходящим.

Опять же, я не хочу тесно связывать или полагаться на элемент управления, существующий на странице. Я хочу, чтобы элементы управления вызывали эти события, но страница может игнорировать их, если захочет.

Правильно ли я поступаю?

Мне бы понравился code образец, только чтобы начать.

Я знаю, что это более сложный вопрос, поэтому я подожду дольше, прежде чем голосовать / выбирать ответы.

Ответы [ 3 ]

2 голосов
/ 07 мая 2010

Вы можете всплыть событие происходит от дочерней к родительской странице. Родительская страница может зарегистрировать это событие и использовать его (если это полезно).

Родительский 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 голосов
/ 07 мая 2010

Предполагается, что вы знаете, что все элементы управления размещены на странице типа App.YourPage

Вот окно быстрого сообщения, которое я помещаю на MasterPage или Page и просто вызываю с любой страницы или элемента управления. (Извините, это в 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
1 голос
/ 08 мая 2010

Валидаторы аннотаций данных действительно хороши для такого рода вещей. Обычно они используются в 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

...