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

ASP.NET Core MVC页面二维数组/JSON数据传递至控制器问题

问题解决:二维数组值无法传递到ASP.NET Core MVC控制器

核心问题

ASP.NET Core MVC默认模型绑定对**多维数组(int[,])**支持有限,当前表单字段的命名方式无法被正确解析,导致控制器接收不到值。以下是分步修复方案:


1. 模型优化(可选但推荐)

保留原有多维数组和Json转换属性,新增同步方法确保数据一致性:

public class Tutor
{
    public const int ROW_Free_time = 30;
    public const int COL_Free_time = 7;

    [NotMapped]
    public int[,] Free_time { get; set; } = new int[COL_Free_time, ROW_Free_time];

    // 用于表单提交的Json字段
    public string Free_timeJson { get; set; }

    // 同步Json字符串与多维数组
    public void SyncFreeTime()
    {
        if (!string.IsNullOrEmpty(Free_timeJson))
        {
            Free_time = JsonConvert.DeserializeObject<int[,]>(Free_timeJson);
        }
        else
        {
            Free_timeJson = JsonConvert.SerializeObject(Free_time);
        }
    }
}

2. 页面代码调整

2.1 添加全局Json存储字段

在表单内新增一个隐藏字段,用于存储整个二维数组的Json字符串:

<!-- 放在表单最外层,存储全局二维数组的Json -->
<input type="hidden" id="freeTimeJson" name="Free_timeJson" value="@Model.Free_timeJson" />

2.2 修改表格按钮结构

移除原有无效的FreeTime[@j,@i]隐藏字段,给按钮添加行列索引的data-*属性:

<td>
    <input type="button" 
           name="buttonValue" 
           onclick="changeColor(this)" 
           class="centered-button" 
           style="background-color: @color"
           data-row="@j" 
           data-col="@i" />
</td>

3. JavaScript逻辑重构

3.1 初始化全局二维数组

页面加载时,从模型的Json字段初始化全局数组,同时恢复按钮颜色状态:

// 全局二维数组,存储所有按钮对应的值
let freeTimeArray = @Html.Raw(Model.Free_timeJson);

// 页面加载时恢复按钮颜色
document.querySelectorAll('.centered-button').forEach(btn => {
    const row = parseInt(btn.dataset.row);
    const col = parseInt(btn.dataset.col);
    const value = freeTimeArray[row][col];
    let color = '';
    switch(value) {
        case 0: color = 'red'; break;
        case 1: color = 'green'; break;
        case 2: color = 'orange'; break;
    }
    btn.style.backgroundColor = color;
});

3.2 重写changeColor函数

点击按钮时更新全局数组,并同步到隐藏字段:

function changeColor(button) {
    const radioButton = document.querySelector('input[name="radioValue"]:checked');
    if (!radioButton) return;

    const selectedValue = parseInt(radioButton.value);
    const selectedColor = radioButton.parentElement.style.color;
    
    // 更新按钮颜色
    button.style.backgroundColor = selectedColor;
    
    // 获取按钮对应的行列索引
    const row = parseInt(button.dataset.row);
    const col = parseInt(button.dataset.col);
    
    // 更新全局数组
    freeTimeArray[row][col] = selectedValue;
    
    // 序列化数组到隐藏字段
    document.getElementById('freeTimeJson').value = JSON.stringify(freeTimeArray);
}

3.3 移除无效函数

删除逻辑有误的changeRadioButtonColor函数,单选按钮无需额外点击事件。


4. 控制器代码调整

直接接收Tutor模型,同步Json数据后保存到数据库:

public async Task<IActionResult> AccountEditTutor(Tutor tutor)
{
    if (ModelState.IsValid)
    {
        // 同步Json字符串到多维数组
        tutor.SyncFreeTime();
        
        // 执行数据库保存操作
        // _context.Tutors.Update(tutor);
        // await _context.SaveChangesAsync();
        
        return RedirectToAction("YourSuccessAction");
    }
    return View(tutor);
}

关键说明

  • 多维数组int[,]的Json序列化格式与交错数组不同,确保JS数组索引顺序与C#多维数组一致(当前模型为[列数,行数]结构)。
  • 采用全局数组+Json序列化的方式,避开模型绑定对多维数组的兼容性问题,实现更简洁可靠的数据传递。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:47:11