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

如何在路由中定义JSON并向Web API传参,及Angular对接.NET Core强类型接收

刚好我之前处理过类似的场景,给你详细拆解这两个问题:

一、Web API 2中定义路由并传递JSON参数

首先要明确:不建议把JSON直接放在路由URL里——URL有长度限制且可读性差,绝大多数场景下,JSON参数都是通过HTTP请求体(POST/PUT方法)传递的。下面是具体实现步骤:

  1. 定义带属性路由的API Action
    用属性路由可以更灵活地定义接口路径,同时通过[FromBody]特性让Web API自动将请求体的JSON序列化到强类型对象:
public class ConsultationController : ApiController
{
    [Route("api/consultation/process-response")]
    [HttpPost]
    public IHttpActionResult ProcessResponse([FromBody] ResponseCurrentStateDataView model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        // 这里写你的业务逻辑
        return Ok("请求处理成功");
    }
}
  1. 全局路由配置(可选)
    如果偏好传统路由而非属性路由,可以在WebApiConfig.cs里配置:
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 优先启用属性路由(推荐)
        config.MapHttpAttributeRoutes();

        // 传统路由模板
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
  1. 特殊场景:路由中传递JSON(不推荐)
    如果业务必须要在路由里带JSON片段,可以先对JSON做URL编码,再在Action里接收字符串参数手动反序列化:
[Route("api/consultation/process/{jsonData}")]
[HttpGet]
public IHttpActionResult ProcessFromRoute(string jsonData)
{
    var model = JsonConvert.DeserializeObject<ResponseCurrentStateDataView>(jsonData);
    // 处理逻辑
    return Ok();
}

Angular端需要用encodeURIComponent(JSON.stringify(model))对JSON做编码后再拼到URL里。

二、Angular调用.NET Core 2.0 API,强类型接收JSON参数

你的Angular模型和C#模型字段名要对应(.NET Core默认支持小驼峰JSON到大驼峰C#属性的自动映射),下面是完整实现流程:

  1. 补全C#强类型类
public class ResponseCurrentStateDataView
{
    public Guid ConsultationId { get; set; }
    public string ResponseTypeId { get; set; }
    public string ResponseTypeTitle { get; set; }
    public string ResponsesRequestedStatus { get; set; }
}
  1. .NET Core API控制器实现
    .NET Core 2.0默认自带JSON序列化支持,用[ApiController]特性还能自动做模型验证:
[ApiController]
[Route("api/[controller]")]
public class ConsultationController : ControllerBase
{
    [HttpPost("process-response")]
    public IActionResult ProcessResponse(ResponseCurrentStateDataView model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        // 业务逻辑处理
        return Ok(new { Message = "处理成功", ReceivedData = model });
    }
}

注:.NET Core中复杂类型默认从请求体绑定,[FromBody]可以省略,加上会更清晰。

  1. Angular端调用API
    先创建服务封装HTTP请求:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ResponseCurrentStateDataModel } from './your-model-path';

@Injectable({ providedIn: 'root' })
export class ConsultationService {
    private apiBaseUrl = 'https://your-api-domain/api/consultation';

    constructor(private http: HttpClient) { }

    submitResponseData(model: ResponseCurrentStateDataModel) {
        return this.http.post<any>(`${this.apiBaseUrl}/process-response`, model);
    }
}

然后在组件中调用服务:

import { Component } from '@angular/core';
import { ConsultationService } from './consultation.service';
import { ResponseCurrentStateDataModel } from './your-model-path';

@Component({
    selector: 'app-consultation',
    templateUrl: './consultation.component.html'
})
export class ConsultationComponent {
    constructor(private consultationService: ConsultationService) { }

    sendData() {
        const requestModel: ResponseCurrentStateDataModel = {
            consultationId: '550e8400-e29b-41d4-a716-446655440000', // 字符串格式的Guid会被.NET自动转为Guid类型
            responseTypeId: 'RT-001',
            responseTypeTitle: '咨询反馈',
            responsesRequestedStatus: 'Pending'
        };

        this.consultationService.submitResponseData(requestModel)
            .subscribe({
                next: res => console.log('请求成功:', res),
                error: err => console.error('请求失败:', err)
            });
    }
}
  1. 关键注意事项
  • 字段映射:.NET Core默认会把Angular的小驼峰字段(如consultationId)自动映射到C#的大驼峰属性(如ConsultationId),如果需要自定义映射,可以在C#属性上标记[JsonProperty("consultationId")]。
  • Guid转换:Angular传递字符串格式的Guid即可,.NET Core会自动完成类型转换,无需手动处理。
  • 请求头:Angular的HttpClient默认会设置Content-Type: application/json,无需额外配置,确保API能正确解析JSON。

内容的提问来源于stack exchange,提问作者K.Z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:11:05