提交表单至Controller时Model始终为Null的排查求助
表单提交后Model始终为Null的问题排查与解决
核心问题1:视图模型缺少模型绑定器可实例化的构造函数
你的PropertyViewModel继承自PublishedContentWrapped,仅提供了需要IPublishedContent和IPublishedValueFallback参数的构造函数。ASP.NET Core的模型绑定器无法自动创建这种依赖外部服务的对象实例,直接导致绑定失败,模型为Null。
修复方案:添加无参构造函数,供模型绑定器使用:
public class PropertyViewModel: PublishedContentWrapped { // 新增无参构造函数,传递null给基类构造(仅用于模型绑定) public PropertyViewModel() : base(null, null) { this.Countries = GetCountries(); } public PropertyViewModel(IPublishedContent content, IPublishedValueFallback publishedValueFallback) : base(content, publishedValueFallback) { this.Countries = GetCountries(); } // 原有属性与方法保持不变... }
核心问题2:AJAX请求的dataType设置冲突
你提交的是multipart/form-data格式的FormData,但AJAX配置中设置了dataType: 'JSON',这会让jQuery错误地处理请求格式,干扰模型绑定的解析逻辑。
修复方案:移除dataType: 'JSON'配置:
$.ajax({ url: "/umbraco/surface/PropertySurface/HandleAddProperty", data: formdata, processData: false, contentType: false, method:"post" }).done(function (response) { // 根据实际响应处理逻辑编写代码 });
额外优化建议
- 确认AntiForgeryToken存在:
Html.BeginUmbracoForm会自动生成__RequestVerificationToken隐藏字段,new FormData(this)已包含该字段,无需手动添加;若后续出现验证失败,可手动确认字段是否被正确携带。 - 适配AJAX的响应格式:当前控制器在验证失败时返回
CurrentUmbracoPage()(整页HTML),AJAX请求无法正确解析。可修改控制器,针对AJAX请求返回JSON格式的错误信息:
[HttpPost] [ValidateAntiForgeryToken] [ValidateUmbracoFormRouteString] public async Task<IActionResult> HandleAddProperty(PropertyViewModel model) { if (!ModelState.IsValid) { if (Request.Headers["X-Requested-With"] == "XMLHttpRequest") { var errors = ModelState.Values .SelectMany(v => v.Errors) .Select(e => e.ErrorMessage); return Json(new { success = false, errors }); } return CurrentUmbracoPage(); } // 执行业务逻辑 return Json(new { success = true }); }
内容的提问来源于stack exchange,提问作者sterix24
相关产品推荐
相关产品推荐

