Ajax POST 未将模型发布到 asp.net 核心 6 中的控制器
Ajax POST not posting model to the controller in asp.net core 6
我正在尝试 POST 从 Kendo 对话框引发的事件向我的控制器发送数据。但是,该模型始终为空。我尝试了 Whosebug 本身提到的各种步骤,但其中 none 有效。
我的 Ajax 电话
function onSubmit(e) {
var myModel={
Id:0,
RoleNameEn:$('#UserRolePopup').find('#RoleNameEn')[0].value,
RoleNameAr:$('#UserRolePopup').find('#RoleNameAr')[0].value,
IsActive:$('#UserRolePopup').find('#IsActive')[0].value,
CreatedBy:0,
CreatedDate:"",
ModifiedBy:0,
ModifiedDate:""
};
$.ajax({
type: "POST",
url: "@Url.Action("Delete", "UserRole")", //'/UserRole/Create'
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(myModel) ,
success: function (result) {
console.log(result);
},
error: function (result, status) {
console.log(result);
}
});
}
我的HTML
<div id="example">
@(Html.Kendo().Dialog()
.Name("dialog")
.Title("Add/Edit User Role")
.Content("<div id='UserRolePopup'> <div class='form-group; k-content'> <label for='RoleNameEn'>User role English</label> <input type='text' class='form-control' id='RoleNameEn' placeholder='Role name in english'/> </div> <div class='form-group'> <label for='RoleNameAr'>User role Arabic</label> <input type='text' class='form-control' id='RoleNameAr' placeholder='Role name in Arabic'> </div> <div class='form-check'> <input class='form-check-input' type='checkbox' value='' id='IsActive'> <label class='form-check-label' for='IsActive'>Is Active</label> </div> </div>")
.Width(400)
.Modal(true)
.Actions(actions =>
{
actions.Add().Text("Cancel");
actions.Add().Text("Submit").Primary(true).Action("onSubmit");
})
.Events(ev => ev.Close("onClose").Open("onOpen"))
)
</div>
现在捕获的数据被传递到控制器。
您可以看到值正在传递给控制器。
我的控制器
[HttpPost]
public JsonResult Delete([FromBody] UserRoleDTO userRoleDTO)
{
return new JsonResult(userRoleDTO);
}
我的 Program.cs
文件
builder.Services.AddMvc()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ContractResolver =
new DefaultContractResolver());
builder.Services.AddControllers().AddNewtonsoftJson();
我尝试过的东西
- 我用过
[FromBody],[FromForm]
- 两个都不起作用
- 将 ajax 中的
datatype
更改为 text
并传递给以字符串作为参数的方法 - 无效
- 尝试了各种方法通过
JSON
。没用
- 将
JSON
更改为 NewtonSoft.Json
。那也没用
有人可以告诉我是否缺少任何配置或为什么这不起作用
也许你可以尝试使用模型创建一个新对象,我试过了,效果很好。
您可以参考下面的代码
Delete.cshtml:
@model AjaxTest1.Models.UserRoleDTO
<div id="example">
<div id='UserRolePopup'>
<div class='form-group; k-content'>
<label for='RoleNameEn'>User role English</label>
<input type='text' class='form-control' id='RoleNameEn' placeholder='Role name in english'/>
</div>
<div class='form-group'>
<label for='RoleNameAr'>User role Arabic</label>
<input type='text' class='form-control' id='RoleNameAr' placeholder='Role name in Arabic'/>
</div>
<div class='form-check'>
<input class='form-check-input' type='checkbox' value='' id='IsActive'/>
<label class='form-check-label' for='IsActive'>Is Active</label>
</div>
</div>
<div class="form-group">
<button type="submit" onclick="onSubmit()">Submit</button>
</div>
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js" type="text/javascript"></script>
<script>
function onSubmit() {
@Model mydata=new Object();
mydata.Id = 0;
mydata.RoleNameEn = $('#UserRolePopup').find('#RoleNameEn')[0].value;
mydata.RoleNameAr = $('#UserRolePopup').find('#RoleNameAr')[0].value;
mydata.IsActive = $('#UserRolePopup').find('#IsActive')[0].value;
mydata.CreatedBy = "0";
mydata.CreatedDate = "";
mydata.ModifiedBy = "0";
mydata.ModifiedDate = "";
$.ajax({
type: "POST",
url: "/Home/Delete",
contentType: 'application/json',
data: JSON.stringify(mydata) ,
success: function (result) {
alert("success");
console.log(result);
},
error: function (result, status) {
alert("123");
console.log(result);
}
});
}
</script>
请注意,您需要使用@model
来引用您的模型。
控制器:
[HttpPost]
public JsonResult Delete([FromBody]UserRoleDTO userRoleDTO)
{
return Json(userRoleDTO);
}
测试结果:
userRoleDTO
developer tools
对不起,积分不够,无法直接上传截图
这是由于我的 property
模型中的一个 datatype
不匹配。 IsActive
在模型中是 Int
,因为我传递的是一个空字符串,所以它没有正确反序列化。
我使用下面的代码调试了这个
[HttpPost]
public JsonResult Delete(UserRoleDTO userRoleDTO)
{
using (var bodyReader = new StreamReader(HttpContext.Request.Body))
{
Task<string> requests = bodyReader.ReadToEndAsync();
UserRoleDTO? userRole = JsonSerializer.Deserialize<UserRoleDTO>(requests.Result);
}
return new JsonResult(userRoleDTO);
}
requests.Result
有我在 Ajax
调用中传递的 JSON
数据。但是 deserializing
抛出错误。
问题解决后,将输入参数更改为 [FromBody] UserRoleDTO userRoleDTO
,现在输入参数中包含值
我仍然想知道为什么控制器中的实际方法 (delete) 即使无法匹配模型数据类型也能正常工作。
我正在尝试 POST 从 Kendo 对话框引发的事件向我的控制器发送数据。但是,该模型始终为空。我尝试了 Whosebug 本身提到的各种步骤,但其中 none 有效。
我的 Ajax 电话
function onSubmit(e) {
var myModel={
Id:0,
RoleNameEn:$('#UserRolePopup').find('#RoleNameEn')[0].value,
RoleNameAr:$('#UserRolePopup').find('#RoleNameAr')[0].value,
IsActive:$('#UserRolePopup').find('#IsActive')[0].value,
CreatedBy:0,
CreatedDate:"",
ModifiedBy:0,
ModifiedDate:""
};
$.ajax({
type: "POST",
url: "@Url.Action("Delete", "UserRole")", //'/UserRole/Create'
contentType: 'application/json; charset=utf-8',
data: JSON.stringify(myModel) ,
success: function (result) {
console.log(result);
},
error: function (result, status) {
console.log(result);
}
});
}
我的HTML
<div id="example">
@(Html.Kendo().Dialog()
.Name("dialog")
.Title("Add/Edit User Role")
.Content("<div id='UserRolePopup'> <div class='form-group; k-content'> <label for='RoleNameEn'>User role English</label> <input type='text' class='form-control' id='RoleNameEn' placeholder='Role name in english'/> </div> <div class='form-group'> <label for='RoleNameAr'>User role Arabic</label> <input type='text' class='form-control' id='RoleNameAr' placeholder='Role name in Arabic'> </div> <div class='form-check'> <input class='form-check-input' type='checkbox' value='' id='IsActive'> <label class='form-check-label' for='IsActive'>Is Active</label> </div> </div>")
.Width(400)
.Modal(true)
.Actions(actions =>
{
actions.Add().Text("Cancel");
actions.Add().Text("Submit").Primary(true).Action("onSubmit");
})
.Events(ev => ev.Close("onClose").Open("onOpen"))
)
</div>
现在捕获的数据被传递到控制器。
您可以看到值正在传递给控制器。
我的控制器
[HttpPost]
public JsonResult Delete([FromBody] UserRoleDTO userRoleDTO)
{
return new JsonResult(userRoleDTO);
}
我的 Program.cs
文件
builder.Services.AddMvc()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ContractResolver =
new DefaultContractResolver());
builder.Services.AddControllers().AddNewtonsoftJson();
我尝试过的东西
- 我用过
[FromBody],[FromForm]
- 两个都不起作用 - 将 ajax 中的
datatype
更改为text
并传递给以字符串作为参数的方法 - 无效 - 尝试了各种方法通过
JSON
。没用 - 将
JSON
更改为NewtonSoft.Json
。那也没用
有人可以告诉我是否缺少任何配置或为什么这不起作用
也许你可以尝试使用模型创建一个新对象,我试过了,效果很好。
您可以参考下面的代码
Delete.cshtml:
@model AjaxTest1.Models.UserRoleDTO
<div id="example">
<div id='UserRolePopup'>
<div class='form-group; k-content'>
<label for='RoleNameEn'>User role English</label>
<input type='text' class='form-control' id='RoleNameEn' placeholder='Role name in english'/>
</div>
<div class='form-group'>
<label for='RoleNameAr'>User role Arabic</label>
<input type='text' class='form-control' id='RoleNameAr' placeholder='Role name in Arabic'/>
</div>
<div class='form-check'>
<input class='form-check-input' type='checkbox' value='' id='IsActive'/>
<label class='form-check-label' for='IsActive'>Is Active</label>
</div>
</div>
<div class="form-group">
<button type="submit" onclick="onSubmit()">Submit</button>
</div>
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js" type="text/javascript"></script>
<script>
function onSubmit() {
@Model mydata=new Object();
mydata.Id = 0;
mydata.RoleNameEn = $('#UserRolePopup').find('#RoleNameEn')[0].value;
mydata.RoleNameAr = $('#UserRolePopup').find('#RoleNameAr')[0].value;
mydata.IsActive = $('#UserRolePopup').find('#IsActive')[0].value;
mydata.CreatedBy = "0";
mydata.CreatedDate = "";
mydata.ModifiedBy = "0";
mydata.ModifiedDate = "";
$.ajax({
type: "POST",
url: "/Home/Delete",
contentType: 'application/json',
data: JSON.stringify(mydata) ,
success: function (result) {
alert("success");
console.log(result);
},
error: function (result, status) {
alert("123");
console.log(result);
}
});
}
</script>
请注意,您需要使用@model
来引用您的模型。
控制器:
[HttpPost]
public JsonResult Delete([FromBody]UserRoleDTO userRoleDTO)
{
return Json(userRoleDTO);
}
测试结果:
userRoleDTO
developer tools
对不起,积分不够,无法直接上传截图
这是由于我的 property
模型中的一个 datatype
不匹配。 IsActive
在模型中是 Int
,因为我传递的是一个空字符串,所以它没有正确反序列化。
我使用下面的代码调试了这个
[HttpPost]
public JsonResult Delete(UserRoleDTO userRoleDTO)
{
using (var bodyReader = new StreamReader(HttpContext.Request.Body))
{
Task<string> requests = bodyReader.ReadToEndAsync();
UserRoleDTO? userRole = JsonSerializer.Deserialize<UserRoleDTO>(requests.Result);
}
return new JsonResult(userRoleDTO);
}
requests.Result
有我在 Ajax
调用中传递的 JSON
数据。但是 deserializing
抛出错误。
问题解决后,将输入参数更改为 [FromBody] UserRoleDTO userRoleDTO
,现在输入参数中包含值
我仍然想知道为什么控制器中的实际方法 (delete) 即使无法匹配模型数据类型也能正常工作。