我如何通过价值MVC3母版页(_layout)? [英] How do I pass value to MVC3 master page ( _layout)?

查看:85
本文介绍了我如何通过价值MVC3母版页(_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???模型在这里?)


解决方案

我们做了如下:


  1. 自定义视图模型分别为masterpages。

     公共类MasterPageViewModel
    {
        公众的Guid CurrentUserId {搞定;组; }
        公共字符串CurrentUserFullName {搞定;组; }
    }


  2. 补充注射过滤器和过滤器供应商。

     公共类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)
            {
            }
        }
    }


  3. 配置过滤器供应商:

      //中的Application_Start
    FilterProviders.Providers.Add(新MasterPageViewModelInjectorFilterProvider());


  4. 使用在主:

      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:

  1. Defined separate viewmodel for masterpages.

    public class MasterPageViewModel
    {
        public Guid CurrentUserId { get; set; }
        public string CurrentUserFullName { get; set; }
    }
    

  2. 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)
            {
            }
        }
    }
    

  3. Configure filter provider:

    //in Application_Start
    FilterProviders.Providers.Add(new MasterPageViewModelInjectorFilterProvider());
    

  4. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆