You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类库中创建支持传递模型的ASP.NET Core ViewResult

解决方案:手动构造带模型数据的ViewResult

你遇到空引用的核心原因是:手动new ViewResult()时,框架不会自动初始化ViewData属性,该属性默认值为null,直接访问ViewData.Model赋值必然抛出空引用异常。

构造ViewDataDictionary的参数说明

你提到的第二个公开构造函数完全适配类库场景,两个参数的含义和获取方式如下:

  • IModelMetadataProvider:MVC框架内置的模型元数据核心组件,负责解析模型类型的元数据、验证规则、显示配置等信息,该组件默认已注册在ASP.NET Core的DI容器中,直接通过构造函数注入即可获取,无需手动实现。
  • ModelStateDictionary:存储模型验证状态的字典,全新构造结果时直接传入一个新的空实例即可。

完整实现代码

  1. 首先在你的通用业务逻辑类中,通过构造函数注入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:51:19