我对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类的新对象,并在其中设置模型属性,但没有成功。
如果我能得到一些帮助,我将不胜感激。
答案 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变量,但布局不会使用它)。