2

ここでいくつかのガイダンスを探しています。

私のサイトでは、Web ユーザー コントロールに配置しています。たとえば、NewsItem コントロール、Article コントロール、ContactForm コントロールがあります。

これらは、私のサイトのさまざまな場所に表示されます。

私が探しているのは、これらのコントロールが存在するページにメッセージを渡す方法です。

それらを密結合したくないので、イベント/デリゲートでこれを行う必要があると思います。ただし、これをどのように実装するかについては少しわかりません。

いくつかの例:

1

お問い合わせフォームが送信されます。送信後、そのメッセージの配置を制限する「あなたのメールが送信されました」に置き換えるのではなく、ステータス メッセージとおそらく推奨される動作でコントロールがオンになっていることをページに通知したいと思います。したがって、メッセージには、レンダリングするテキストと、いいenumDisplayAs.PopupDisplayAs.Success

2

Article Control は、データベースに Article オブジェクトを照会します。データベースは例外を返します。DisplayAs.Errorカスタム例外は、列挙型とともにページに渡されます。ページはこのエラーを処理し、エラーが発生した場所に表示します。

ValidationSummary コントロールと同様のことを達成しようとしていますが、列挙型が適切であると感じたときにページにメッセージを表示できるようにしたいという点が異なります。

繰り返しますが、ページに存在するコントロールを厳密にバインドしたり、依存したりしたくありません。コントロールでこれらのイベントを発生させたいのですが、必要に応じてページでそれらを無視できます。

私はこれを正しい方法で行っていますか?

code始めるためだけにサンプルが欲しいです。

これはより複雑な質問であることはわかっているので、回答を投票/選択する前に、もう少し待ちます.

4

3 に答える 3

2

以下は、コントロールがすべてタイプのページに配置されていることがわかっていることを前提としていますApp.YourPage

これは、MasterPage または Page に配置し、任意のページまたはコントロールから呼び出すだけの簡単なメッセージ ボックスです。(申し訳ありませんが、C#ではなくVB.netにあります)

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
于 2010-05-07T18:25:03.127 に答える
2

子ページで発生したイベントを親ページにバブルアップできます。親ページはそのイベントを登録して利用できます(有用な場合)。

親 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();
}
于 2010-05-07T19:14:06.290 に答える
1

データ注釈バリデーターは、この種のものに非常に適しています。通常、これらは ASP.NET MVC 内で使用されますが、Web フォームでも問題なく機能します。組み込みのバリデーターを使用することも、より複雑な検証を行う独自のカスタム バリデーターを作成することもできます。

この例は 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

于 2010-05-07T20:16:51.657 に答える