加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 如何将值传递给MVC3母版页(_layout)?

发布时间:2020-12-16 03:58:42 所属栏目:asp.Net 来源:网络整理
导读:我有一个自定义模型绑定器,它检查身份验证cookie并返回值. public class UserDataModelBinderT : IModelBinder{ public object BindModel(ControllerContext controllerContext,ModelBindingContext bindingContext) { if (controllerContext.RequestContext
我有一个自定义模型绑定器,它检查身份验证cookie并返回值.

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;
    }
}

如果我需要使用它,我只需要将它传递给动作.一切正常.

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

    return View(userData);
}

但是,我想在我的母版页中使用它,因为一旦用户登录,我想在每个页面的顶部显示他们的信息.我尝试了一些东西,但是不能让它发挥作用

@Html.RenderPartial("LoginPartial",???model here??)

解决方法

我们这样做了:

>为主页定义单独的viewmodel.

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

>添加了注入过滤器和过滤器提供商

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

>配置筛选提供程序:

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

>在master中使用:

ViewBag.MasterPageViewModel

这样你就可以得到很好的解耦结构.当然你可以将它与依赖注入结合起来(我们这样做,但为了清楚起见,我把它留了出来)并根据你想要的方式为每个动作配置你的动作过滤器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读