ASP.NET中的自制MessageBox.Show()

时间:2011-07-26 07:24:17

标签: c# asp.net

我想重建WinForms应用程序的MessageBox.Show()的“外观和感觉”。

使用“look& feel”我的意思是使用我已经实现的ShowMessage方法的逻辑来调用MessageBox.Show()命令。

我目前的代码隐藏:

public partial class Testpage : System.Web.UI.Page
{
    public enum MessageBoxIcon { Information, Error, Warning }

    protected void Page_Load(object sender, EventArgs e)
    {
        ShowMessage("Testmessage", MessageBoxIcon.Error, ex);
    }

    private void ShowMessage(string title, string message, MessageBoxIcon type, Exception ex)
    {
        if (type == MessageBoxIcon.Information)
        {
            pnlMsgBox.CssClass = "MessageBoxInformation";
            imgMsgBox.ImageUrl = "Resources/img/icon/MessageBoxIcon.Information.png";
        }

        else if (type == MessageBoxIcon.Warning)
        {
            pnlMsgBox.CssClass = "MessageBoxWarning";
            imgMsgBox.ImageUrl = "Resources/img/icon/MessageBoxIcon.Warning.png";
        }

        else if (type == MessageBoxIcon.Error)
        {
            pnlMsgBox.CssClass = "MessageBoxError";
            imgMsgBox.ImageUrl = "Resources/img/icon/MessageBoxIcon.Error.png";
        }

        else
            throw new NotImplementedException();

        lblMsgBox.Text = "<span style=\"font-size: large;\">" + title + "</span><br /><br />" + message;

        #if (DEBUG)
        if (ex != null)
            lblMsgBox.Text += "<br /><br /><b>Debug information:</b> " + ex.Message;
        #endif

        pnlMsgBox.Visible = true;

        updPnl.Update();
    }
}

我想打电话给这样的话:

    protected void Page_Load(object sender, EventArgs e)
    {
        MessageBox.Show("Testmessage", MessageBoxIcon.Error, ex);
    }

但是

public static class MessageBox : Testpage
{
    public static void Show(string message)
    {
        // do stuff with the page controls.
    }
}

无法正常工作,因为Testpage不是静态的。

有人对我有一些建议吗?

2 个答案:

答案 0 :(得分:1)

将评论读到上一个答案,我想下一步:

很难从分离的静态类访问当前页面上下文。那么,我推荐做下一步:

定义下一个界面:

public interface IMessageBoxContainer
{
    UpdatePanel UpdatePanel { get; }
    Label Label { get; }
}

并按照您的页面实施他:

public partial class _Default : System.Web.UI.Page, IMessageBoxContainer
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public UpdatePanel UpdatePanel
    {
        get { return updatePanel1; }
    }
    public Label Label
    {
        get { return label1; }
    }
}

此步骤可让您随时随地访问自己的网页。之后实现MessageBox非静态类:

public class MessageBox
{
    private IMessageBoxContainer container = null;

    public MessageBox(IMessageBoxContainer _container)
    {
        container = _container;
    }

    public void Show(string message)
    {
        container.Label.Text = message;
        container.UpdatePanel.Update();
    }
}

为什么要非静电?如果您将容器字段设置为静态并在页面中的任何位置设置值(例如在Page_Load中),当另一个页面将加载时,您的容器属性将重置。但如果没有此字段,指向当前页面的指针,则无法访问您的特定控件。

之后,您可以像这样使用您的课程:

protected void Button1_Click(object sender, EventArgs e)
{
    var box = new MessageBox(this);
    box.ShowMessage("hello world");
}

所以,你得到了MessageBox的独立实现逻辑,并且使用了他,是吗?但不合时宜,它是非静态的。

答案 1 :(得分:0)

试试这样:

public static class MessageBox
{
    public static void Show(string message)
    {
        HttpContext.Current.Response.Write(string.Format("<script>alert('{0}');</script>", message));
    }
}

当然,您需要实现自己正确的JavaScript以在客户端显示MessageBox。但我认为 - 你接近是错误的。对于方法编程,请尝试查看ASP.NET MVC,因为经典ASP.NET不完全支持JavaScript编码。