我如何通过价值MVC3母版页(_layout)? [英] How do I pass value to MVC3 master page ( _layout)?
问题描述
我有一个自定义的模型绑定器,它检查验证cookie和返回值。
公共类UserDataModelBinder< T> :IModelBinder
{
公共对象BindModel(ControllerContext controllerContext,ModelBindingContext的BindingContext)
{ 如果(controllerContext.RequestContext.HttpContext.Request.IsAuthenticated)
{
VAR饼干=
controllerContext.RequestContext.HttpContext.Request.Cookies [FormsAuthentication.FormsCookieName] 如果(饼干== NULL)
返回null; VAR解密= FormsAuthentication.Decrypt(cookie.Value); 如果(!string.IsNullOrWhiteSpace(decrypted.UserData))
返回JsonSerializer.DeserializeFromString< T>(decrypted.UserData);
} 返回null;
}
}
如果我需要使用它,我只是需要将它传递给动作。一切正常。
公众的ActionResult指数(用户数据的UserData)
{
AccountLoginWidgetVM模式=新AccountLoginWidgetVM();
如果(NULL!=用户数据)
model.UserData =用户数据; 返回视图(用户数据);
}
不过,我想用它在我的母版页,因为一旦用户登录,我想展示自己的每个页面顶部的信息。我尝试了一些东西,coudln't得到它的工作。
@ Html.RenderPartial(LoginPartial???模型在这里?)
我们做了如下:
-
自定义视图模型分别为masterpages。
公共类MasterPageViewModel
{
公众的Guid CurrentUserId {搞定;组; }
公共字符串CurrentUserFullName {搞定;组; }
} -
补充注射过滤器和过滤器供应商。
公共类MasterPageViewModelInjectorFilterProvider:IFilterProvider
{
公共IEnumerable的<滤光器> GetFilters(ControllerContext controllerContext,ActionDescriptor actionDescriptor)
{
返回新的[] {新的过滤器(新MasterPageViewModelInjectorFilter(),FilterScope.Action,NULL)};
} 私有类MasterPageViewModelInjectorFilter:IResultFilter
{
公共无效OnResultExecuting(ResultExecutingContext filterContext)
{
VAR的ViewResult = filterContext.Result为的ViewResult;
如果(的ViewResult == NULL)
返回; 如果(viewResult.ViewBag.MasterPageViewModel!= NULL)
返回; 任何你想要的方式//设置模式
VAR视图模型=新MasterPageViewModel();
//注入模型导入ViewBag
viewResult.ViewBag.MasterPageViewModel =视图模型;
} 公共无效OnResultExecuted(ResultExecutedContext filterContext)
{
}
}
} -
配置过滤器供应商:
//中的Application_Start
FilterProviders.Providers.Add(新MasterPageViewModelInjectorFilterProvider()); -
使用在主:
ViewBag.MasterPageViewModel
这种方式你精细耦合结构。当然你也可以使用依赖注入结合起来(我们这样做,但我离开它的清晰度),并配置任何你想要的方式的每一个动作你的行动过滤器。
I have a custom modelbinder, its check the authentication cookie and return the 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 pass it to the 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 in my master page, because once user login, i want to display their info on the top on every page. I tried a few things, coudln't get it work
@Html.RenderPartial("LoginPartial", ???model here??)
We did it as follows:
Defined separate viewmodel for masterpages.
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) { } } }
Configure filter provider:
//in Application_Start FilterProviders.Providers.Add(new MasterPageViewModelInjectorFilterProvider());
Use in master:
ViewBag.MasterPageViewModel
This way you have fine uncoupled architecture. Of course you can combine it with Dependency Injection (we do, but I left it out for clarity) and configure your action filter for every action whichever way you want.
这篇关于我如何通过价值MVC3母版页(_layout)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!