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

如何从Razor视图向Post Action传递List<Object>集合?

解决Razor视图向Post Action传递List集合的问题

我之前踩过一模一样的坑!你现在遇到的问题根源在于:复杂集合类型(比如List<SqlParameter>)没办法通过Url参数的方式被ASP.NET Core的模型绑定正确解析,而且Post请求本来就更适合把复杂数据放在请求体里传递,而不是拼在Url上。下面给你一步步的解决方案:

1. 调整Action参数(可选但推荐)

首先,你可以把query和sqlParameters封装到一个模型里(其实你已经有ContactHomePage了),这样Action参数更整洁,也方便模型绑定:

public async Task<IActionResult> GetRecords(JqGridRequest request, ContactHomePage model) { }

如果不想改现有Action参数也没关系,后面的Ajax写法稍微调整就行。

2. 处理SqlParameter的序列化问题

直接序列化SqlParameter这个系统类型很容易出问题——它有很多内部属性,序列化后不仅冗余,还可能导致模型绑定失败。建议自定义一个Dto来传递你需要的属性:

public class SqlParameterDto
{
    public string ParameterName { get; set; }
    public object Value { get; set; }
    public DbType DbType { get; set; }
    // 其他你需要的属性,比如Size、Direction等
}

然后在你的ContactHomePage里把List<SqlParameter>换成List<SqlParameterDto>,或者在视图里把原模型的SqlParameters映射成Dto集合。

3. 编写正确的Ajax请求

核心要点是:把数据放在请求体里,用JSON格式传递,并且设置contentType: 'application/json'。

示例代码(Razor视图中):

// 先准备要传递的数据
var postData = {
    // 如果是jqGrid的请求,这里的request可以直接用jqGrid自带的参数,或者根据你的需求构造
    request: {},
    // 传递你的查询参数和Sql参数集合
    query: '@Model.Query',
    sqlParameters: @Html.Raw(Json.Serialize(Model.SqlParameters.Select(p => new { 
        p.ParameterName, 
        p.Value, 
        p.DbType 
    })))
};

// 发送Ajax请求
$.ajax({
    url: '@Url.Action("GetRecords", "Contact")',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(postData),
    success: function(response) {
        // 处理返回的结果,比如更新jqGrid数据
        // $("#gridId").jqGrid('setGridParam', { data: response }).trigger('reloadGrid');
    },
    error: function(xhr, status, error) {
        console.error('请求出错:', error);
    }
});

关键细节说明:

  • @Html.Raw(Json.Serialize(...)):把服务器端的模型数据转成合法的JSON字符串,避免Razor自动转义引号。
  • JSON.stringify(postData):把JavaScript对象转成JSON字符串,这样后端能正确解析。
  • contentType: 'application/json':告诉服务器请求体是JSON格式,ASP.NET Core会自动用JSON模型绑定器解析参数。

4. 在Action中还原SqlParameter(如果用了Dto)

如果用了自定义的SqlParameterDto,在Action里把Dto转成真正的SqlParameter即可:

var realSqlParams = sqlParameters.Select(dto => new SqlParameter(dto.ParameterName, dto.Value) {
    DbType = dto.DbType
    // 其他属性按需设置
}).ToList();

为什么之前的写法不行?

Url参数只能传递简单类型(字符串、数字等),对于List<SqlParameter>这种复杂集合,ASP.NET Core的模型绑定无法正确解析Url里的参数格式——哪怕你把集合拼到Url上,也会因为参数结构太复杂导致绑定失败。而Post请求的请求体是专门用来传递复杂数据的,用JSON格式传递是最可靠的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:41:46