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

如何为嵌入ASP.NET MVC的React组件自动生成TypeScript客户端?

自动生成ASP.NET MVC与React组件间数据传输的TypeScript客户端方案

方案一:改造MVC控制器兼容NSwag的OpenAPI生成

NSwag核心依赖OpenAPI规范,只需让MVC控制器能被Swagger识别并生成规范,就能复用现有NSwag工作流:

  1. 给MVC控制器添加API标识:
    为现有MVC控制器添加[ApiController]和路由属性,让Swashbuckle(Swagger生成工具)能扫描到这些接口:

    [ApiController]
    [Route("api/foo")]
    public class FooController : Controller
    {
        [HttpGet("getfoo")]
        [ProducesResponseType(typeof(FooDto), StatusCodes.Status200OK)]
        public async Task<IActionResult> GetFoo(int fooId)
        {
            // 原有逻辑
            var foo = new FooDto { /* ... */ };
            return Json(foo);
        }
    }
    

    [ProducesResponseType]用于明确返回的DTO类型,确保Swagger能正确解析。

  2. 配置Swashbuckle生成OpenAPI文档:
    在MVC项目中安装Swashbuckle.AspNetCore NuGet包,然后在Program.cs(或Startup.cs)中配置服务和中间件:

    // 添加Swagger服务
    builder.Services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "MVC API", Version = "v1" });
        // 包含DTO所在程序集的注释(可选,生成更详细的文档)
        var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
        var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
        c.IncludeXmlComments(xmlPath);
    });
    
    // 启用Swagger中间件
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "MVC API V1");
    });
    
  3. 用NSwag生成TypeScript客户端:
    复用现有WebAPI项目的NSwag配置,指向MVC项目生成的Swagger JSON地址(如http://localhost:xxxx/swagger/v1/swagger.json),即可自动生成包含DTO类型、请求方法的TS客户端,完全替代手动编写的代码。

方案二:直接从C# DTO生成TypeScript类型

如果不想修改MVC控制器结构,可以直接针对DTO类生成TS代码:

  • 使用NSwag命令行工具:
    直接指向包含DTO的MVC程序集,生成TS类型和客户端代码:

    nswag typecript /assembly:YourMvcProject.dll /output:MvcClient.ts /controllerNamePattern:*Controller
    

    该命令会从DLL中提取控制器和DTO信息,生成与手动编写结构一致的TS类(包含构造函数、类型映射,比如自动处理DateTime转Date)。

  • 使用TypeWriter VS扩展:
    安装TypeWriter扩展后,编写自定义模板来匹配TS类需求。例如以下模板可以生成带构造函数的接口和类:

    $Classes(c => c.Name.EndsWith("Dto"))[
    export interface I$Name {
        $Properties[
        $name: $Type;
        ]
    }
    
    export class $Name implements I$Name {
        $Properties[
        $name!: $Type;
        ]
    
        constructor(data?: I$Name) {
            if (data) {
                $Properties[
                this.$name = data["$name"];
                ]
            }
        }
    }
    ]
    

    模板可自定义处理特殊类型(如DateTime转Date,嵌套DTO实例化),保存模板后会自动同步C# DTO的修改到TS代码。

方案三:自动化JSON Schema生成流程

如果之前尝试过生成JSON Schema,可将该流程自动化:

  1. 编写脚本生成DTO的JSON Schema:
    使用Newtonsoft.Json.Schema库编写控制台程序或PowerShell脚本,遍历DTO类生成Schema并保存到指定目录:
    var generator = new JSchemaGenerator();
    var schema = generator.Generate(typeof(FooDto));
    File.WriteAllText("FooDto.schema.json", schema.ToString());
    
  2. 集成到构建流程:
    在MVC项目的构建事件中添加该脚本的执行命令,确保每次构建后Schema自动更新。
  3. 用NSwag基于Schema生成TS代码:
    配置NSwag命令行或NSwagStudio项目,指向生成的Schema文件,自动生成对应的TS类型,实现全流程自动化。

关键注意事项

  • 确保C# DTO的命名规范与TS兼容(如使用[JsonPropertyName]属性调整序列化后的字段名,避免大小写问题)。
  • 对于复杂类型(如嵌套DTO、枚举),上述工具均能自动处理映射,无需手动编写转换逻辑。

内容的提问来源于stack exchange,提问作者user8607541

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:47:53