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

ASP.NET Core MVC控制器返回带模型的分部视图时如何强制PascalCase序列化

解决方案

首先明确:PartialView() 本身返回的是HTML格式响应,不涉及JSON序列化逻辑,你拿到的camelCase属性,本质是序列化模型的环节使用了全局默认配置。以下是符合「仅当前控制器/当前请求生效,不修改全局配置」要求的实现方案:


方案1:局部视图内手动序列化(最简便)

如果你是在_CustomerPartialView.cshtml中把模型序列化为JSON传递给前端JS,直接在视图内传入自定义序列化配置即可:

基于Newtonsoft.Json实现

@{
    // 你自定义的PascalCase序列化配置
    var serializerSettings = new Newtonsoft.Json.JsonSerializerSettings 
    {
        ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver()
    };
}

<!-- 序列化后传递给JS -->
<script>
const customer = @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model, serializerSettings));
</script>

基于System.Text.Json实现

@{
    var jsonOptions = new System.Text.Json.JsonSerializerOptions
    {
        PropertyNamingPolicy = null // 设为null则保留属性原始PascalCase格式
    };
}

<script>
const customer = @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Model, jsonOptions));
</script>

方案2:控制器内统一处理(适合同时返回视图HTML+模型数据的场景)

如果你的AJAX请求需要同时拿渲染好的HTML和PascalCase的模型数据,可先把局部视图渲染为字符串,再和模型一起用自定义配置序列化返回:

  1. 先在控制器注入视图引擎服务:
private readonly ICompositeViewEngine _viewEngine;
// 控制器构造函数注入
public YourControllerName(ICompositeViewEngine viewEngine)
{
    _viewEngine = viewEngine;
}
  1. 新增视图渲染辅助方法:
private async Task<string> RenderPartialViewToString(string viewName, object model)
{
    ViewData.Model = model;
    using var writer = new StringWriter();
    var viewResult = _viewEngine.GetView(executingFilePath: null, viewPath: viewName, isMainPage: false);
    if (!viewResult.Success)
    {
        throw new InvalidOperationException($"未找到指定视图:{viewName}");
    }
    var viewContext = new ViewContext(
        ControllerContext,
        viewResult.View,
        ViewData,
        TempData,
        writer,
        new HtmlHelperOptions()
    );
    await viewResult.View.RenderAsync(viewContext);
    return writer.GetStringBuilder().ToString();
}
  1. 修改动作方法逻辑:
public async Task<IActionResult> GetCustomer(int id)   
{
     var customer = GetCustomerFromDb(id);
     // 渲染局部视图为HTML字符串
     var viewHtml = await RenderPartialViewToString("_CustomerPartialView", customer);
     // 用自定义PascalCase配置序列化返回
     var serializerSettings = new Newtonsoft.Json.JsonSerializerSettings 
     {
         ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver()
     };
     return Json(new { Html = viewHtml, Data = customer }, serializerSettings);
}

前端AJAX回调中可以通过response.Html拿到渲染好的DOM,response.Data拿到PascalCase格式的模型属性。

方案3:当前控制器全局生效配置

如果当前控制器所有JSON返回都需要用PascalCase格式,可以重写控制器的Json方法,无需每次手动传配置:

public override JsonResult Json(object data)
{
    var serializerSettings = new Newtonsoft.Json.JsonSerializerSettings 
    {
        ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver()
    };
    return base.Json(data, serializerSettings);
}

该配置仅对当前控制器的返回生效,不会影响项目内其他控制器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:39:03