gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 22:34:11 24 4
gpt4 key购买 nike

我有一个自定义模型绑定(bind)器,它检查身份验证 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??)  

最佳答案

我们是这样做的:

  • 为母版页定义了单独的 View 模型。
    public class MasterPageViewModel
    {
    public Guid CurrentUserId { get; set; }
    public string CurrentUserFullName { get; set; }
    }
  • 添加了注入(inject)过滤器和过滤器提供程序。
    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());
  • 在主控中使用:
    ViewBag.MasterPageViewModel

  • 这样你就有了很好的解耦架构。当然,你可以将它与依赖注入(inject)结合起来(我们这样做,但为了清楚起见我把它省略了),并以你想要的方式为每个 Action 配置你的 Action 过滤器。

    关于asp.net-mvc - 如何将值传递给 MVC3 母版页(_layout)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11739905/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com