从OnActionExecuting显式设置时,ViewModel为null

时间:2011-07-17 21:40:45

标签: c# asp.net-mvc-3 viewmodel

我研究了几个关于SO的问题,但似乎无法找到答案。谁知道,也许我打破了最佳实践。在阅读了关于使用布局注入器属性以通过简单地指定属性来设置布局的优秀答案之后,我想我也可以使用这种类来控制需要用户进行身份验证的控制器。

所以,我不是必须在任何地方检查身份验证,而是写了以下内容:

    // class AdminAttribute
public class AdminAttribute : LayoutInjectorAttribute
{
    // ctor
    public AdminAttribute()
        : base("_LayoutAdmin")
    {
    }   // eo ctor


    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        WebUser user = WebApplication.CurrentUser;
        if (!user.IsAuthenticated)
        {
            filterContext.Result = new ViewResult() { ViewName = "Unauthorised" };
            filterContext.Controller.ViewData.Model = new ViewModel(WebApplication.CurrentUser.Translate("msgunauthorisedtitle"));
            filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
            return;
        }
        base.OnActionExecuting(filterContext);
    }   // eo OnActionExecuting

}   // eo class AdminAttribute

除了处理视图时模型为null这一事实外,所有工作都有效。有谁知道为什么会这样?

视图页面(Unauthorised.cshtml)

@model Py2.Web.ViewModel
<h2>@Model.Title</h2>

提前致谢!

1 个答案:

答案 0 :(得分:3)

试试这样:

if (!user.IsAuthenticated)
{
    var result = new ViewResult { ViewName = "Unauthorised" };
    var model = new ViewModel(
        WebApplication.CurrentUser.Translate("msgunauthorisedtitle")
    );
    result.ViewData.Model = model;
    filterContext.Result = result;
    return;
}

请注意,不需要显式调用ExecuteResult,这是ASP.NET MVC frameowrk的工作,只需通过传递模型(result.ViewData.Model = model)返回ViewResult。另请注意此视图模型传递给视图结果的方式,而不是像在代码中那样传递给filterContext.Controller.ViewData.Model