【问题标题】:ViewModel is null when explicitly setting from OnActionExecuting从 OnActionExecuting 显式设置时 ViewModel 为空
【发布时间】:2011-07-17 21:40:44
【问题描述】:

我研究了一些关于 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>

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    试试这样:

    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 框架的工作,只需通过传递模型 (result.ViewData.Model = model) 来返回 ViewResult。还要注意这个视图模型传递给视图结果的方式,而不是像您在代码中所做的那样传递给filterContext.Controller.ViewData.Model

    【讨论】:

    • 非常感谢!那是一种享受。我做错了什么?再次感谢您的建议。
    • @Moo-Juice,正如我在回答中解释的那样,您做错了几件事:1.您明确调用filterContext.Result.ExecuteResult,2.您没有将视图模型分配给正确的对象 (filterContext.Controller.ViewData.Model) 而不是将其分配给视图结果。
    猜你喜欢
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    相关资源
    最近更新 更多