عمومی سازی Viewbag در تمامی View ها

احتمالا برای شما هم اتفاق افتاده که بخواهید  یک viewbag در تمامی View ها قابل دسترسی باشد . همانطور که می دانید Viewbag فقط در view مربوط در Action ی که در آن ایجاد شده است قابل دسترسی است .

به طور مثال اگر بخواهید کلمات کلیدی  را از دیتابیس خوانده و در View مروبطه اقدام به تولید Meta تگ های مروبوطه نمایید می توانید مقادیر مورد نظر را در Viewbag ذخیره کرده و در View های مورد نظر به آنها دسترسی داشته باشید (می توان این کار را به روش های دیگری هم انجام داد اینجا هدف فقط بیان یک مثال بود) .

1- روش اول : استفاده از کنترلر پایه

یکی از راه های ساده برای انجام این کار تعریف یک کنترلر پایه و مقدار دهی Viewbag ها در تحریف متد View به صورت زیر می باشد :

public class BaseController : Controller

    {
        protected override ViewResult View(IView view, object model)
        {
            this.ViewBag.MyProperty = "value";
            return base.View(view, model);
        }
    }

2- نوشتن یک فیلتر سفارشی

یک راه حل دیگر برای انجام این کار نوشتن یک فیلتر سفارشی و مقدار دهی ViewBag مورد نظر در متد OnResultExecuting می باشد .

public class MyPropertyActionFilter : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.Controller.ViewBag.MyProperty = "value";
    }

درصورتی که قصد عمومی سازی فیلتر فوق را دارید می توانید همانند زیر عمل نمایید ، در غیر اینصورت میتوانید بر روی کنترلر های مورد نظر اعمال نمایید :

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalFilters.Filters.Add(new MyPropertyActionFilter(), 0);
}

3-  Module

 protected override void AttachToComponentRegistration(IComponentRegistry cr,
                                                      IComponentRegistration reg)
    {
        Type limitType = reg.Activator.LimitType;
        if (typeof(Controller).IsAssignableFrom(limitType))
        {
            registration.Activated += (s, e) =>
            {
                dynamic viewBag = ((Controller)e.Instance).ViewBag;
                viewBag.MyProperty= "value";
            };
        }
    }

4 - ایجاد یک WebViewPage   سفارشی همانند زیر :

 public abstract class ApplicationViewPage<T> : WebViewPage<T>
    {
        protected override void InitializePage()
        {
            SetViewBagDefaultProperties();
            base.InitializePage();
        }

        private void SetViewBagDefaultProperties()
        {
            ViewBag.GlobalProperty = "MyValue";
        }
    }

 


توسط : عثمان رحیمی  1 ماه قبل ، چهارشنبه 27 مرداد 1395 ساعت 21:40  0  1126

نظر شما برای ما مهم است و به ما در بهبود سایت کمک میکند.


ارسال نظر
  • نام (اختیاری ) :
  • پست الکترونیک :
  • توضیحات :

مطالب مرتبط