开发者

ASP.NET: displaying notification on another page, after succesfully saved data to database

I searched the web but haven't found a real good answer for this question..

Let's say I have a form, on AddToList.aspx, and i want that after you hit send, it will direct you back to List.aspx, with a message "The Item was added to list" in a message box div.

do i need to send List.aspx?msg=my message, or is there another good way of doing it?

EDIT:

so i made this helper class:

   开发者_Python百科public class MessageHelper : System.Web.UI.MasterPage
    {
        public void SetMessage(String message)
        {
            Session["Message"] = message;
        }

        public string GetMessage()
        {
            if (String.IsNullOrEmpty(Session["Message"]))
            {
                String temp = Session["Message"];
                Session["Message"] = "";
                return temp;
            }
            else
            {
                return "";
            }
        }
    }

and got this error:

Error   32  The best overloaded method match for 'string.IsNullOrEmpty(string)' has some invalid arguments
Error   33  Argument '1': cannot convert from 'object' to 'string'
Error   34  Cannot implicitly convert type 'object' to 'string'. An explicit conversion exists (are you missing a cast?)


You need to convert to string. Session parameters are stored as objects.

It may also be userful to implement this as a extension method. This way it will be available on all page types (Master and UI)

  public static class MessageHelper
    {
        public static void SetMessage(this Page page, String message)
        {
            Session["Message"] = message;
        }

        public static string GetMessage(this Page page)
        {
            var messageText = Session["Message"] as string;
            if (!String.IsNullOrEmpty(messageText ))
            {
                Session["Message"] = "";
                return messageText;
            }
            return "";
        }
    }


You could certainly use the query string to pass data to your List.aspx page, but be careful passing text that you're planning on writing out in the HTML - you'll need to protect against XSS attacks.

There are several other ways to do this. Chances are, you're going to have several places in your application where you want to redirect the user to another page, but also display a message that has something to do with what they did on the previous page (saved an item, deleted an item, etc.). It would be better to come up with more of a global scheme for this rather than a one-off just for this particular instance.

One idea is to use the Session for storing a message, then do your redirect.

Session("Message") = "Item was added to list."
Response.Redirect("List.aspx")

Then, on your pages (or a Master Page, perhaps), you check Session("Message") and if it's got something, you show that message to the user, then clear that variable.

If Session("Message") IsNot Nothing Then
  Response.Write(CType(Session("Message"), String)) 'or set a label text, or show a pop up div, or whatever'
  Session("Message") = Nothing
End If

If you use this approach, I recommend you write a helper class, and just use that to manage your messaging:

MessageHelper.SetMessage("Item added to list.")

and

MessageHelper.GetMessage()

would be the methods you would need.


I believe you could do it by setting the PostBackUrl of the button used to save the data to "List.aspx". Maybe set a variable to true/false on AddToList.aspx and then access it from List.aspx?

Not sure if it's better but it's an option.


I can't comment yet or I would have just commented this to your post. You need to cast your session variable like this: (string)Session["Message"]. So, code would look like this:

public class MessageHelper : System.Web.UI.MasterPage
{
    public void SetMessage(String message)
    {
        Session["Message"] = message;
    }

    public string GetMessage()
    {
        if (String.IsNullOrEmpty((string)Session["Message"]))
        {
            String temp = (string)Session["Message"];
            Session["Message"] = "";
            return temp;
        }
        else
        {
            return "";
        }
    }
}

Actually there's a better way of writing that class: make it one property instead of two methods. It would look like this: (I also fixed your logic; GetMessage was always returning blank)

public class MessageHelper : System.Web.UI.MasterPage
{
    public MessageHelper()
    {

    }

    public string Message
    {
        set { Session["Message"] = value; }
        get
        {
            if (String.IsNullOrEmpty((string)Session["Message"]))
            {
                Session["Message"] = "";
            }
            return (string)Session["Message"];
        }
    }
}

In your two respective files, you would set and get it like so:

//in AddToList.aspx
MessageHelper msg = new MessageHelper();
msg.Message = "The Item was added to your list.";

//and in List.aspx, assigned to an arbitrary Label named myMessageLabel
MessageHelper msg = new MessageHelper();
myMessageLabel.Text = msg.Message;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜