如何在类库中创建支持传递模型的ASP.NET Core ViewResult
解决方案:手动构造带模型数据的ViewResult
你遇到空引用的核心原因是:手动new ViewResult()时,框架不会自动初始化ViewData属性,该属性默认值为null,直接访问ViewData.Model赋值必然抛出空引用异常。
构造ViewDataDictionary的参数说明
你提到的第二个公开构造函数完全适配类库场景,两个参数的含义和获取方式如下:
IModelMetadataProvider:MVC框架内置的模型元数据核心组件,负责解析模型类型的元数据、验证规则、显示配置等信息,该组件默认已注册在ASP.NET Core的DI容器中,直接通过构造函数注入即可获取,无需手动实现。ModelStateDictionary:存储模型验证状态的字典,全新构造结果时直接传入一个新的空实例即可。
完整实现代码
- 首先在你的通用业务逻辑类中,通过构造函数注入
IModelMetadataProvider:
public class CommonBusinessService { private readonly IModelMetadataProvider _modelMetadataProvider; // DI容器会自动注入该实例,无需额外注册配置 public CommonBusinessService(IModelMetadataProvider modelMetadataProvider) { _modelMetadataProvider = modelMetadataProvider; } public IActionResult ExecuteBusinessLogic() { // 你的业务逻辑判断,满足跳转条件就返回RedirectResult if (needRedirect) { return new RedirectResult("target-url"); } // 构造带模型的ViewResult var myModel = new MarketingPreferencesModel(); // 你的业务模型实例 var viewResult = new ViewResult { ViewName = "MarketingPreferences", ViewData = new ViewDataDictionary(_modelMetadataProvider, new ModelStateDictionary()) { Model = myModel // 在这里直接赋值模型,不会抛出空引用 } }; // 如果需要传额外的ViewData键值对,直接追加即可 // viewResult.ViewData["PageDesc"] = "用户营销偏好设置"; return viewResult; } }
补充说明
- 第一个拷贝构造函数仅适合你已经持有现成
ViewDataDictionary实例的场景(比如在控制器、操作过滤器中编写逻辑),独立类库中没有现成实例时不需要使用。 - 只要你的类库是被ASP.NET Core MVC/Razor Pages项目引用调用,就不需要额外做DI注册,框架启动时已经默认完成了
IModelMetadataProvider的注册。
内容的提问来源于stack exchange,提问作者Learning AWS and PostgreSQL
相关产品推荐
相关产品推荐

