我有一个自定义的模型绑定器,它检查验证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??)
我们做到了,如下所示:
对于masterpages定义单独视图模型。
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());
使用在主:
ViewBag.MasterPageViewModel
这样,您就具有优良的解耦架构。 当然你也可以使用依赖注入结合起来(我们这样做,但我离开它的清晰度),并配置你的行动过滤器任何你想要的方式的每一个动作。
在这种情况下,你可以使用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)
你必须确保用户数据不为空。 如果这将是空的传递模式将视图的默认模式。