我如何通过价值MVC3母版页(_layout)?(How do I pass value to MV

2019-06-26 16:13发布

我有一个自定义的模型绑定器,它检查验证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);
}

不过,我想用它在我的母版页,因为一旦用户登录,我想展示自己在每个页面顶端的信息。 我尝试了一些东西,coudln't得到它的工作

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

Answer 1:

我们做到了,如下所示:

  1. 对于masterpages定义单独视图模型。

     public class MasterPageViewModel { public Guid CurrentUserId { get; set; } public string CurrentUserFullName { get; set; } } 
  2. 加入注射过滤器和过滤器供应商。

     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. 配置过滤器供应商:

     //in Application_Start FilterProviders.Providers.Add(new MasterPageViewModelInjectorFilterProvider()); 
  4. 使用在主:

     ViewBag.MasterPageViewModel 

这样,您就具有优良的解耦架构。 当然你也可以使用依赖注入结合起来(我们这样做,但我离开它的清晰度),并配置你的行动过滤器任何你想要的方式的每一个动作。



Answer 2:

在这种情况下,你可以使用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)

你必须确保用户数据不为空。 如果这将是空的传递模式将视图的默认模式。



文章来源: How do I pass value to MVC3 master page ( _layout)?