访问整个项目中的模型变量MVC5 Razor - 使用Basecontroller设置BaseViewModel并在Layout中使用它

时间:2014-12-07 13:37:52

标签: c# asp.net-mvc razor asp.net-mvc-5 asp.net-mvc-viewmodel

我对MVC5有点新意,我试图使用以下答案中显示的方法在整个项目中设置全局变量: Razor MVC, where to put global variables that's accessible across master page, partiview and view?

我的目标是在基本控制器中设置变量,只要视图发生变化,布局页面就可以使用这些变量。

我面临的问题如下: 我已经创建了一个由所有其他控制器继承的基本控制器;

public class BaseController : Controller
    {
        protected ViewModelBase ModelBase { get; private set; }

        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            if (filterContext.Result is ViewResultBase)//Gets ViewResult and PartialViewResult
            {

                object viewModel = ((ViewResultBase)filterContext.Result).Model;

                if (viewModel != null && viewModel is ViewModelBase)
                {
                    ViewModelBase baseVM = viewModel as ViewModelBase;

                    ALM_APP objALM_APP = new ALM_APP();
                    objALM_APP = DalContext.getAppInformation();


                    baseVM.ApplicationName = objALM_APP.ApplicationName;
                    baseVM.AppVersion = objALM_APP.Version;
                }
            }

            base.OnActionExecuted(filterContext);//this is important!
        }  
    }

然后我创建了一个ViewModelBase类,它使用_Layout.cshtml强类型

namespace TestProject.Models
{
    public abstract class ViewModelBase
    {
        public string ApplicationName { get; set; }
        public string AppVersion { get; set; }
        public string Name { get; set; }
        public string Domain { get; set; }
        public string UserID { get; set; }
        public string Groups { get; set; }
        public string LoginTime { get; set; }

        public Dictionary<string, string> MenuList { get; set; }
    }
}

public class CommonViewModel : ViewModelBase
{
}

在_Layout.cshtml文件中,我按如下方式调用viewmodelbase:

@model TestProject.Models.ViewModelBase

然后我在布局中使用了如下的模型属性:

@Model.ApplicationName

在这种情况下,当filterContext.Result被类型化为ViewResultBase时,viewModel在BaseController中始终为null:

object viewModel = ((ViewResultBase)filterContext.Result).Model;

由于@ Model.ApplicationName正在抛出Null引用异常,如下所示:

“App_Web_3t5b2o3k.dll中发生'System.NullReferenceException'类型的异常,但未在用户代码中处理”

我还试图在basecontroller中创建一个CommonViewModel类的新对象,并在其中设置模型属性,但没有成功。

如果我能得到一些帮助,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

我使用与CRUD视图中类似的方法传递给具有用户权限的视图标志(CanCreate,CanUpdate等)。但在这种情况下,我知道何时这样做。在你的情况下是适用范围。

你可以试试这个:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var controller = filterContext.Controller as BaseController;

    // IController is not necessarily a Controller
    if (controller != null)
    {
        ALM_APP objALM_APP = new ALM_APP();
        objALM_APP = DalContext.getAppInformation();

        controller.ViewBag.ApplicationName = objALM_APP.ApplicationName;
        controller.ViewBag.AppVersion = objALM_APP.Version;

     }
}

因此,在每个执行的新Action中,都会重新加载ViewBag变量。 如果您调用PartialView,则不会执行布局...因此,没有问题(重新加载ViewBag变量,但布局不会使用它)。