Thứ Tư, 27 tháng 8, 2014

Using TempData Outside the Controller in ASP.NET MVC


2 Jun 2014
Using TempData outside the controller in ASP.NET MVC and making TempData less prone to error and more intuitive.
Is your email address OK? You are signed up for our newsletters but your email address is either unconfirmed, or has not been reconfirmed in a long time. Please click here to have a confirmation email sent so we can confirm your email address and start sending you newsletters again. Alternatively, you can update your subscriptions.

What is the Problem We Are Trying to Fix?

When you start using Tempdata, it quickly becomes evident that maintaining it will be quite a challenge because Intellisense doesn't support Tempdata since it's a Dictionary. Without intellisense, suddenly life looks gloomy, but no fear. There is hope!

My Problem

The problem raised when I wanted to use Notification Object across my website. I wanted to throw this object from one controller to the other (tempdata job) and finally send it to the view. If I wanted to useTempData["something"], then I have to remember this "something".
So instead of hardcoding this "something" inside the controller, I decided to put the hardcoding inside aHelper.cs function and simply call intuitive functions that will Get/Set/Remove the object. The beauty of it is that - there is Intellisense to help us out!

Solution

The solution is quite simple.
  1. Create the Notification object
  2. Create a helper function that will do the dirty work (get;set;remove)
Since we moved TempData outside the controller, we are obliged to send the controller to be able to use theTempData. We send the controller by the keyword this.

PromptNotification.cs

public class PromptNotification //Notification Object
{
    public bool NotificationSuccess { get; set; }
    public string NotificationMessage { get; set; }
}

Helper.cs

public static void SetPromptNotification(Controller controller, bool success,string message)
{
    PromptNotification promptNotification = new PromptNotification
    {
        NotificationSuccess = success,
        NotificationMessage = message
    };
    controller.TempData["PromptNotification"] = promptNotification;
}

public static PromptNotification GetPromptNotification(Controller controller)
{
    try
    {
        PromptNotification promptNotification = controller.TempData["PromptNotification"] 
            as PromptNotification;
        return promptNotification;
     }
     catch (Exception ex)
     {
         // log error here

         return null;
     }
}

public static void RemovePromptNotification(Controller controller)
{
    controller.TempData.Remove("PromptNotification");
}

UserController.cs //set

// add promp message => redirect to index
Helper.SetPromptNotification(this, true, 
    "You will shortly receive an email, please verify your registration.");

MainController.cs //get

// get promptnotification => if it exist => pass it to the view => clear the notification
PromptNotification promptNotification = Helper.GetPromptNotification(this);

if (promptNotification != null)
{
    ViewBag.NotificationSuccess = promptNotification.NotificationSuccess;
    ViewBag.NotificationMessage = promptNotification.NotificationMessage;

    Helper.RemovePromptNotification(this);
}

Index.cshtml

@if (ViewBag.NotificationSuccess != null)
{
    PromptNotification promptNotification = new PromptNotification
    {
        NotificationSuccess = (bool)ViewBag.NotificationSuccess,
        NotificationMessage = ViewBag.NotificationMessage as string
    };
    
    string notificationClassName = String.Empty;

    if (promptNotification.NotificationSuccess == true)
    {
        notificationClassName = "notificationSuccessWrapper";
    }
    else
    {
        notificationClassName = "notificationErrorWrapper";
    }
    
    <div class="@Html.Raw(notificationClassName)">
        @promptNotification.NotificationMessage
    </div>
}

Không có nhận xét nào:

Đăng nhận xét