qin*_*126 4 asp.net-mvc model-binding asp.net-mvc-3
我有一个自定义模型绑定器,它检查身份验证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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我需要使用它,我只需要将它传递给动作.一切正常.
public ActionResult Index(UserData userData)
{
AccountLoginWidgetVM model = new AccountLoginWidgetVM();
if (null != userData)
model.UserData = userData;
return View(userData);
}
Run Code Online (Sandbox Code Playgroud)
但是,我想在我的母版页中使用它,因为一旦用户登录,我想在每个页面的顶部显示他们的信息.我尝试了一些东西,但是不能让它发挥作用
@Html.RenderPartial("LoginPartial", ???model here??)
Run Code Online (Sandbox Code Playgroud)
Ser*_*sev 11
我们这样做了:
为masterpages定义了单独的viewmodel.
public class MasterPageViewModel
{
public Guid CurrentUserId { get; set; }
public string CurrentUserFullName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)添加了注入过滤器和过滤器
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)
{
}
}
}
Run Code Online (Sandbox Code Playgroud)配置筛选提供程序
//in Application_Start
FilterProviders.Providers.Add(new MasterPageViewModelInjectorFilterProvider());
Run Code Online (Sandbox Code Playgroud)在master中使用:
ViewBag.MasterPageViewModel
Run Code Online (Sandbox Code Playgroud)这样你就可以得到很好的解耦结构.当然你可以将它与依赖注入结合起来(我们这样做,但为了清楚起见,我把它留了出来)并根据你想要的方式为每个动作配置你的动作过滤器.