如何转换表单序列化命名属性实现模型绑定(无需重命名参数)
解决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
相关产品推荐
相关产品推荐

