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

如何转换表单序列化命名属性实现模型绑定(无需重命名参数)

解决ASP.NET Core模型绑定前缀不匹配问题

针对表单提交字段前缀Task.与Action参数名taskDto不匹配导致绑定失败的问题,以下是几种无需重命名参数的解决方案:

方案1:使用BindPrefix特性指定绑定前缀

直接在Action参数上添加BindPrefix特性,告诉模型绑定器将前缀为Task的字段绑定到taskDto实例上,这是最简洁的后端解决方案:

[HttpPost]
public IActionResult Insert([FromForm, BindPrefix("Task")] TaskDto taskDto)

也可以使用Bind特性的Prefix参数达到同样效果:

[HttpPost]
public IActionResult Insert([FromForm, Bind(Prefix = "Task")] TaskDto taskDto)

方案2:前端修改表单字段名称

如果不想修改后端代码,可以在序列化表单数据时,将字段前缀从Task.替换为taskDto.:

var $form = $('form');
var formData = $form.serializeArray();

// 遍历修改字段前缀
formData.forEach(item => {
    if (item.name.startsWith('Task.')) {
        item.name = item.name.replace('Task.', 'taskDto.');
    }
});

// 提交修改后的表单数据
$.ajax({
    url: '/YourController/Insert',
    method: 'POST',
    data: formData,
    // 其他配置
});

或者直接在视图中手动指定输入框的name属性(但会失去ASP.NET Core强类型标签助手的优势,不推荐):

<input class="form-control" name="taskDto.Prop1" value="@Model.Task.Prop1" />

方案3:临时包装视图模型(可选)

如果仅该场景需要,可以创建一个包含TaskDto的临时视图模型,调整视图的强类型绑定:

public class TaskDtoFormViewModel
{
    public TaskDto TaskDto { get; set; }
    public IEnumerable<Problem> Problems { get; set; }
}

视图中使用该模型:

<input class="form-control" asp-for="TaskDto.Prop1" />

此时表单提交的字段会以TaskDto.为前缀,可直接绑定到Action的taskDto参数。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:50:27