我正在尝试将当前的MVC5项目迁移到MVC6,但是主要是通过ViewDataDictionary
在新名称空间/方法上遇到了一些小麻烦。在MVC5中,您可以像这样传递模型轻松地启动new ViewDataDictionary
。
PartialViewResult pv = new PartialViewResult();
pv.ViewData = new ViewDataDictionary(model);
...但是在MVC6中,如果没有实际可用的ViewDataDictionary对象,似乎没有任何重载。
所以我想我的问题是,从头开始创建新的ViewDataDictionary的最佳方法是什么?我可以看到以下重载,但是找不到如何使用它的任何示例。
public ViewDataDictionary(IModelMetadataProvider metadataProvider, ModelStateDictionary modelState);
最佳答案
您可以创建一个新的ViewDataDictionary
,然后分配其模型属性。
新框架可以做到这一点,ViewDataDictionaryControllerPropertyActivator
创建ViewData。当您在控制器中使用View
之类的辅助方法之一(如return View(model)
中)时,将设置模型模型属性
您只需要获取一个IModelMetadataProvider
即可在控制器中使用DI或通过HttpContext.ApplicationServices
服务定位器获得。
public IActionResult SomeAction()
{
var modelMetadataProvider = this.Context.ApplicationServices.GetRequiredService<IModelMetadataProvider>();
var viewDataDictionary = new ViewDataDictionary<FooModel>(modelMetadataProvider, new ModelStateDictionary());
viewDataDictionary.Model = new FooModel();
...
}
也许您可以提供一个扩展方法:
public static ViewDataDictionary<T> CreateViewDataDictionary<T>(this HttpContext httpContext, T model)
{
var modelMetadataProvider = httpContext.ApplicationServices.GetRequiredService<IModelMetadataProvider>();
return new ViewDataDictionary<T>(modelMetadataProvider, new ModelStateDictionary())
{
Model = model
};
}
public IActionResult SomeAction()
{
var viewDataDictionary = this.Context.CreateViewDataDictionary(new FooModel());
...
}