How to pass value to MVC3 main page (_layout)?

I have a custom model file, authentication cookie validation and return value.

public class UserDataModelBinder<T> : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { if (controllerContext.RequestContext.HttpContext.Request.IsAuthenticated) { var cookie = controllerContext.RequestContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; if (cookie == null) return null; var decrypted = FormsAuthentication.Decrypt(cookie.Value); if (!string.IsNullOrWhiteSpace(decrypted.UserData)) return JsonSerializer.DeserializeFromString<T>(decrypted.UserData); } return null; } } 

if I need to use it, I just need to transfer it to action. everything works.

 public ActionResult Index(UserData userData) { AccountLoginWidgetVM model = new AccountLoginWidgetVM(); if (null != userData) model.UserData = userData; return View(userData); } 

However, I want to use it on my main page, because after logging in, I want to display their information on the top of each page. I tried a few things without getting it.

  @Html.RenderPartial("LoginPartial", ???model here??) 
+4
source share
2 answers

We did it as follows:

  • Defined separate viewing model for master pages.

     public class MasterPageViewModel { public Guid CurrentUserId { get; set; } public string CurrentUserFullName { get; set; } } 
  • Added injection filter and filter provider.

     public class MasterPageViewModelInjectorFilterProvider: IFilterProvider { public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) { return new [] {new Filter(new MasterPageViewModelInjectorFilter(), FilterScope.Action, null), }; } private class MasterPageViewModelInjectorFilter: IResultFilter { public void OnResultExecuting(ResultExecutingContext filterContext) { var viewResult = filterContext.Result as ViewResult; if (viewResult == null) return; if (viewResult.ViewBag.MasterPageViewModel != null) return; //setup model whichever way you want var viewModel = new MasterPageViewModel(); //inject model into ViewBag viewResult.ViewBag.MasterPageViewModel = viewModel; } public void OnResultExecuted(ResultExecutedContext filterContext) { } } } 
  • Set filter provider:

     //in Application_Start FilterProviders.Providers.Add(new MasterPageViewModelInjectorFilterProvider()); 
  • Usage in the main:

     ViewBag.MasterPageViewModel 

So you have a beautiful unconnected architecture. Of course, you can combine it with Dependency Injection (we do, but I left it for clarity) and set up an action filter for each action, whatever you want.

+11
source

In this case, you can use the ViewBag.

 public ActionResult Index(UserData userData) { AccountLoginWidgetVM model = new AccountLoginWidgetVM(); if (null != userData) model.UserData = userData; ViewBag.UserData = userData; return View(userData); } @Html.RenderPartial("LoginPartial", ViewBag.UserData) 

You must ensure that userData is not null. If it is null, then the accepted model will be the default model for the view.

0
source

All Articles