عمومی سازی Viewbag در تمامی View ها
احتمالا برای شما هم اتفاق افتاده که بخواهید یک viewbag در تمامی View ها قابل دسترسی باشد . همانطور که می دانید Viewbag فقط در view مربوط در Action ی که در آن ایجاد شده است قابل دسترسی است .
به طور مثال اگر بخواهید کلمات کلیدی را از دیتابیس خوانده و در View مروبطه اقدام به تولید Meta تگ های مروبوطه نمایید می توانید مقادیر مورد نظر را در Viewbag ذخیره کرده و در View های مورد نظر به آنها دسترسی داشته باشید (می توان این کار را به روش های دیگری هم انجام داد اینجا هدف فقط بیان یک مثال بود) .
1- روش اول : استفاده از کنترلر پایه
یکی از راه های ساده برای انجام این کار تعریف یک کنترلر پایه و مقدار دهی Viewbag ها در تحریف متد View به صورت زیر می باشد :
1 2 3 4 5 6 7 8 9 |
public class BaseController : Controller { protected override ViewResult View(IView view, object model) { this.ViewBag.MyProperty = "value"; return base.View(view, model); } } |
2- نوشتن یک فیلتر سفارشی
یک راه حل دیگر برای انجام این کار نوشتن یک فیلتر سفارشی و مقدار دهی ViewBag مورد نظر در متد OnResultExecuting می باشد .
1 2 3 4 5 6 |
public class MyPropertyActionFilter : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.Controller.ViewBag.MyProperty = "value"; } |
درصورتی که قصد عمومی سازی فیلتر فوق را دارید می توانید همانند زیر عمل نمایید ، در غیر اینصورت میتوانید بر روی کنترلر های مورد نظر اعمال نمایید :
1 2 3 4 5 |
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); GlobalFilters.Filters.Add(new MyPropertyActionFilter(), 0); } |
3- Module
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 سفارشی همانند زیر :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public abstract class ApplicationViewPage<T> : WebViewPage<T> { protected override void InitializePage() { SetViewBagDefaultProperties(); base.InitializePage(); } private void SetViewBagDefaultProperties() { ViewBag.GlobalProperty = "MyValue"; } } |
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.