ASP.NET Core 6中Kendo Dialog触发Ajax POST时模型无法传递至控制器的问题求助
解决Kendo Dialog Ajax提交后控制器模型为Null的问题
让我们一步步排查你遇到的问题,我看了你的代码,有几个关键点需要调整:
1. 修复Checkbox值的获取逻辑
你当前获取IsActive的方式是错误的——Checkbox的value属性你设为空字符串,而且判断是否选中应该用.checked属性,而非.value。这会导致传递给控制器的IsActive值无效,直接破坏模型绑定:
修改JS里的myModel部分:
IsActive: $('#UserRolePopup').find('#IsActive')[0].checked,
这样就能正确传递布尔值(true/false)给控制器的IsActive属性。
2. 阻止Kendo Dialog按钮的默认行为
Kendo Dialog的Submit按钮自带内置行为,可能会干扰你的Ajax请求,需要在onSubmit函数开头添加阻止默认行为的代码:
function onSubmit(e) { // 阻止默认提交行为,避免页面刷新或请求中断 e.preventDefault(); var myModel={ Id:0, RoleNameEn:$('#UserRolePopup').find('#RoleNameEn')[0].value, RoleNameAr:$('#UserRolePopup').find('#RoleNameAr')[0].value, IsActive:$('#UserRolePopup').find('#IsActive')[0].checked, // 这里已修改 CreatedBy:0, CreatedDate:"", ModifiedBy:0, ModifiedDate:"" }; // 剩下的Ajax代码保持不变 }
3. 验证JSON序列化与模型属性的匹配
确保你的UserRoleDTO类的属性名和JS里的myModel属性完全一致(包括大小写),比如C#类应该是这样的:
public class UserRoleDTO { public int Id { get; set; } public string RoleNameEn { get; set; } public string RoleNameAr { get; set; } public bool IsActive { get; set; } public int CreatedBy { get; set; } public string CreatedDate { get; set; } // 如果用DateTime类型,JS里要传递合法的日期格式 public int ModifiedBy { get; set; } public string ModifiedDate { get; set; } }
另外,你当前用的DefaultContractResolver会保持属性名原样,所以JS属性名必须和C#完全匹配。如果后续想改用JS常用的驼峰命名,可以把配置改成:
builder.Services.AddMvc() .AddNewtonsoftJson(options => options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver());
这样JS里用roleNameEn也能绑定到C#的RoleNameEn。
4. 检查请求URL是否正确
注意你Ajax里的URL指向的是Delete方法,但注释里写的是Create。如果是新增操作,应该改成@Url.Action("Create", "UserRole"),避免请求到错误的控制器方法。
5. 调试技巧(排查剩余问题)
如果还是无效,可以按F12打开浏览器开发者工具,在Network标签里查看Ajax请求的细节:
- 检查Request Payload里的JSON结构是否和模型匹配
- 确认请求的Content-Type是否为
application/json; charset=utf-8 - 查看控制器返回的响应是否包含错误提示
按以上步骤修改后,应该能解决模型为Null的问题。
内容的提问来源于stack exchange,提问作者smilu
相关产品推荐
相关产品推荐

