ورود / ثبت نام
0
0

نمایش پیام در صفحه جدید بدون استفاده از Session در MVC

281 بازدید
نمایش پیام در صفحه جدید

نمایش پیام در صفحه جدید

این مقاله راه حل ساده ای برای نمایش پیام در صفحه جدید به کاربر درصورت مقدار بازگشتی RedirectResult از یک action و بدون استفاده از Session ارائه می دهد. در ASP.Net MVC گاهی پیش می آید که لازم است بعد از پردازشی در سمت سرور، پیامی به کاربر نمایش داده شود. حال اگر controller actionبه صفحه جدیدی هدایت شود، پیام از دست خواهد رفت.

نمایش پیام در صفحه جدید

من در بسیاری از پروژه های ASP.Net MVC خود، مکانیسم Session را غیر فعال می کنم. با این شرایط ، چگونه می توان درصورتی که باید redirect اتفاق بیفتد پیامی نمایش داد؟

در اینجا راه حلی برای ثبت پیام برای استفاده اپلیکیشن ارائه می دهیم که مانند یک صفحه (View) به کاربر نمایش داده خواهد شد.

BaseController:

مرحله اول ایجاد یک BaseController است که از کنترلرها ارث بری می نماید.

این کنترلر باید شامل یک notification برای نمایش به کاربر و یک متد برای مقداردهی به این property باشد.

در آخر این action، اگر notification ای وجود داشته باشد، آن را برای نمایش در view یافته شده، در ViewData ذخیره می کنیم.

public abstract partial class BaseController: Controller {  
    private string notification;  
    /// <summary>    
    /// Add notification to users    
    /// </summary>    
    /// <param name="message"></param>    
    protected void AddNotification(string message) {  
        notification = message;  
    }  
    /// <summary>    
    /// </summary>    
    /// <param name="filterContext"></param>    
    protected override void OnResultExecuting(ResultExecutingContext filterContext) {  
        if (!string.IsNullOrWhiteSpace(this.notification)) filterContext.Controller.ViewData.Add("PageLoadNotification", this.notification);  
    }  
}  

حال می توانیم notification خود را اضافه نماییم.

public class HomeController: BaseController {  
    public ActionResult Index() {  
        AddNotification("hello");  
        return View();  
    }  
} 

Notification.cshtml:

یک _notification.cshtml view در فولدر “Views\Shared” ایجاد می کنیم که notification ها را نمایش دهد.

(Razor syntax)

@{    
    var show = false;    
    var notification = string.Empty;    
        
    if(ViewData.ContainsKey("PageLoadNotification"))    
    {    
        notication = ViewData["PageLoadNotification"] as string;    
    }    
    show = !string.IsNullOrWhiteSpace(notification);         
}    
    
  
<div @(Html.Raw(show ? "" : "style=\"display:none;\""))>    
    @if (show)    
    {    
          
    <text>    
        @(notification)    
        </text>    
    }    
  
</div>

 

در View “master” خود یک view partial _notifications.cshtml اضافه می کنیم.

<!DOCTYPE html>  
<html>  
    <head>  
        <meta charset="utf-8" />  
        <meta http-equiv="X-UA-Compatible" content="IE=edge">  
        <meta name="viewport" content="width=device-width, initial-scale=1.0">  
    </head>  
    <body>  
        <div class="page">    
           @Html.Partial("_notifications")    
           @RenderBody()    
  
           <div class="clear"></div>  
       </div>  
    </body>  
</html> 

Redirects:

حالا مشکل مدیریت redirect است. فرض کنید خطایی رخ داده یا در هدایت کاربر به صفحه دیگر می خواهیم پیامی به کاربر نشان دهیم. برای این کار، پیام خود را به کوکی منتقل می کنیم که بعد از استفاده پیام پاک می شود.

public static class CookieManager {#region Get / Set  
    /// <summary>    
    /// Set a value in cookie in the response    
    /// </summary>    
    /// <param name="cookieName">Nom du cookie</param>    
    /// <param name="value">Valeur</param>    
    public static void SetValue(string cookieName, string value) {  
        if (System.Web.HttpContext.Current != null) {  
            HttpCookie c = new HttpCookie(cookieName, value);  
            c.Expires = DateTime.Now.AddMonths(6);  
            if (System.Web.HttpContext.Current.Response.Cookies.Get(cookieName) == null) System.Web.HttpContext.Current.Response.Cookies.Add(c);  
            else System.Web.HttpContext.Current.Response.Cookies.Set(c);  
        }  
    }  
    /// <summary>    
    /// get a value from Request cookie    
    /// </summary>    
    /// <param name="cookieName">Nom du cookie</param>    
    /// <returns>Valeur dans le cookie, chaine vide sinon</returns>    
    public static string GetValue(string cookieName) {  
        if (System.Web.HttpContext.Current != null && System.Web.HttpContext.Current.Request.Cookies[cookieName] != null) return System.Web.HttpContext.Current.Request.Cookies[cookieName].Value;  
        else return string.Empty;  
    }#endregion  
}  

حال BaseController را طوری تغییر می دهیم که اگر redirect داشته باشیم، notification را در کوکی ذخیره کند یا عملیات جاری را در زمان نمایش پیام در یک View نگه دارد:

public abstract partial class BaseController: Controller {  
    private string notification;  
    protected override void OnResultExecuting(ResultExecutingContext filterContext) {  
        if (filterContext.Result is ViewResult) {  
            var notificationCookie = CookieManager.GetValue("wscNotification");  
            if (!string.IsNullOrWhiteSpace(notificationCookie)) {  
                // There is an older notication :    
                this.notification = HttpUtility.UrlDecode(notificationCookie);  
                CookieManager.SetValue("wscNotification", string.Empty);  
            }  
            filterContext.Controller.ViewData.Add("PageLoadNotification", this.notification);  
        } else {  
            if (!string.IsNullOrWhiteSpace(this.notification)) {  
                // We store notication in cooki for the next request :    
                CookieManager.SetValue("wscNotification", HttpUtility.UrlEncode(this.notification));  
            }  
        }  
    }  
}  

توجه داشته باشید که بسیار مهم است که داده های خود را که در کوکی ذخیره می کند به دلایل مسائل امنیتی رمزنگاری کنید. به فراخوانی متدهای HttpUtility().UrlEncode() و HttpUtility.UrlDecode() قبل از ذخیره داده ها در کوکی فکر کنید.

به این ترتیب شما می توانید بدون استفاده از Session پیامی را برای کاربر از صفحه ای به صفحه دیگر ارسال نمایید.

توجه داشته باشید که این کار همیشه نیاز به این دارد که کاربر شما کوکی را بپذیرد و اطلاعات ارسالی شما نیز اطلاعات حساسی که می توان در مرورگر تغییر داد، نباشند.

  • پسورد: www.mspsoft.com
آیا این مطلب را می پسندید؟
https://www.mspsoft.com/?p=16196
اشتراک گذاری:
واتساپتوییترفیسبوکپینترستلینکدین
داریوش فرخی
داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .
مطالب بیشتر
برچسب ها:

نظرات

0 نظر در مورد نمایش پیام در صفحه جدید بدون استفاده از Session در MVC

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

هیچ دیدگاهی نوشته نشده است.