c# - 从 OnActionExecuting 显式设置时 ViewModel 为 null

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

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

因此,我不必到处检查身份验证,而是编写了以下内容:

    // 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

除了处理 View 时模型为 null 之外,一切正常。有谁知道为什么会这样?

查看页面(Unauthorised.cshtml)

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

提前致谢!

最佳答案

像这样尝试:

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)返回 ViewResult = 模型)。另请注意此 View 模型传递给 View 结果的方式,而不是像您在代码中那样传递给 filterContext.Controller.ViewData.Model

关于c# - 从 OnActionExecuting 显式设置时 ViewModel 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6726966/

相关文章:

c# - CustomValidator ServerValidate 方法不触发

asp.net-mvc-3 - MVC 3 + EF 4.1 + POCO + ViewModel 模式 + 带脚手架的 Controller == 困惑!

c# - MVC 3 - Controller 和 ViewModels - 哪个应该包含大部分业务逻辑?

c# - 那么... ASP.NET MVC 和 WebSockets?

android - 每次如何在koin中创建viewModel的新实例

c# - 将 MS Oracle 客户端转换为 Oracle 数据提供程序 - OracleException

c# - 将实例化的 System.Type 作为泛型类的类型参数传递

c# - 转换 Model3DGroup 两次

javascript - ASP.NET MVC3 中 Razor View 特定 JQuery 代码的最佳实践

asp.net-mvc-3 - ASP.NET MVC 3 : Purpose of IgnoreRoute ("{resource}.axd/{*pathInfo}"); ? 已弃用?