gpt4 book ai didi

c# - 在 .NET 核心中使用 Ajax 发布多个模型对象

转载 作者:行者123 更新时间:2023-11-30 21:43:35 24 4
gpt4 key购买 nike

我一直在绞尽脑汁和关于同一主题的各种 SO 帖子(请参阅 JQuery Ajax and Posting multiple complex objects to asp.net MVC ControllerPassing multiple objects to my controller 等),但我无法通过 Ajax 调用向我的 Controller (.NET Core) 发布多个对象.我相信我已经像本教程 (http://www.dotnetcurry.com/aspnet-mvc/1253/multiple-model-objects-input-controller-action-methods) 一样设置了我的代码,并且还使用了这里的建议:http://andrewlock.net/model-binding-json-posts-in-asp-net-core/ 无济于事。

问题:我只能获取第一个对象,不能获取第二个对象进行绑定(bind)。

Controller 方法:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Apply(ApplicationInfoViewModel info, SRAgreementViewModel agreement)
{
if(ModelState.IsValid){
//do stuff. ModelState.IsValid returns false here.
}
}

这是我的 JS:

$(function () {
$("#ApplyBAOForm").submit(function (e) {
var jsonObj = $('#ApplyForm').serialize();
var srFormJsonObj = $('#SRForm').serialize();

$.ajax({
url: "ApplyBao/Apply",
datatype: "json",
contentType: "application/json; charset=utf-8",
data: { info: jsonObj, agreement: srFormJsonObj },
type: "POST"
}).done(function (result) {
console.log("Apply success: " + result);
if (result.type === "success") {
//hooray
}
else {
//boo
}
});

});
});

所以这有点奇怪:这里实际上有来自两个不同表单的数据。 SRform 数据在提交 ApplyForm 之前进行验证(它处于模式中),但实际上只是为了与 ApplyForm 保持持久性而提交。两种形式生成的序列化对象看起来都是正确且相似的(jsonObj 和 srFormObj)。

当我点击 ModelState.IsValid 语句时,它返回 false,因为 SRAgreement 对象本质上为 null(具有默认值)。但是,ApplicationInfoViewModel 对象正确显示了表单中的数据。

我尝试过的其他事情:

  • 将两个对象组合成一个 View 模型(两个子对象结果是空的?)
  • 将 SRAgreement 对象添加为 ApplicationInfo 对象的子对象; SRAgreement 对象为空。
  • 按照 Andrew Lock 的博客文章所述添加 [FromBody],这会导致 HTTP 415 不受支持的媒体类型响应

可能有更好的方法来做到这一点,但我认为我正在尝试做的事情应该是可行的。

谢谢!

编辑 2:

看来我什至无法绑定(bind)一个 JSON 对象。我必须缺少一些简单的东西。我已将其缩减为仅将两个对象之一作为 JSON 提交:

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Apply([FromBody] ApplicationInfoViewModel info)
{
if (ModelState.IsValid)
{
// do stuff
}
}

JS:

$("#ApplyBAOForm").submit(function (e) {
e.preventDefault();

var jsonObj = ConvertFormToJSON($("#ApplyBAOForm"));
var srFormJsonObj = ConvertFormToJSON($("#SRForm"));
var obj2 = JSON.stringify({ info: jsonObj });

$.ajax({
url: "ApplyBao/Apply",
datatype: "json",
contentType: "application/json; charset=utf-8",
data: obj2,
//data: JSON.stringify(jsonObj),
type: "POST"
}).done(function (result) {
console.log("Apply success: " + result);

}
else {
//show some error message or something
}
});
});
});

现在请求看起来像这样:

Request URL:http://localhost:19194/ApplyBao/Apply
Request Method:POST
Status Code:400 Bad Request
Remote Address:[::1]:19194
Response Headers
view parsed
HTTP/1.1 400 Bad Request
Server: Kestrel
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNccmdiMDA3M1xEb2N1bWVudHNcYmFvYWRtaW5pc3RyYXRpb25cc3JjXEJBT0FkbWluaXN0cmF0aW9uXEFwcGx5QmFvXEFwcGx5?=
X-Powered-By: ASP.NET
Date: Thu, 12 Jan 2017 21:59:27 GMT
Content-Length: 0
Request Headers
view parsed
POST /ApplyBao/Apply HTTP/1.1
Host: localhost:19194
Connection: keep-alive
Content-Length: 580
Pragma: no-cache
Cache-Control: no-cache
Accept: */*
Origin: http://localhost:19194
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Content-Type: application/json; charset=UTF-8
Referer: http://localhost:19194/ApplyBao
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.8
Cookie: .AspNetCore.Antiforgery.l7Q8WGuEtq8=CfDJ8K9L5D4kNnBPrb3_9Hu-w57rjjf751Qf9eh-z57qWmtMA53AB6FXsZ7pbIuLkdP2F6GjA7TGl0Tz7TfACCn3QeFt_uC-BgsYnk3Nd8z0ZA0c90XVEA90NnQOnmVFRu_KF2_2DXV89Jur84rMa-s26nQ
Request Payload
view parsed
{"info":{"HearAboutUsSelectedId":"137","FirstName":"Ron","LastName":"Bud","MiddleName":"","MaidenName":"","Email":"r@test.com","BirthDate":"1900-01-15","Phone":"123456","Fax":"","Street":"1234","City":"Denton","State":"TX","Zip":"12345","Country":"USA","SelectedExamTrack":"BCaBA","SelectedTranscriptSendMethod":"requested","Degree":"Education","SraId":"00000000-0000-0000-0000-000000000000","__RequestVerificationToken":"CfDJ8K9L5D4kNnBPrb3_9Hu-w56wPCITEDVZQo7flUIB70Pu4Q81TlRXa_oI4t8Bleou6l45oHHmUFrKusKofA6Gey-uSgKP7M3L-DrawE1TVJnrDsULHlnOE9ngg9LuyFK6-cylBJ-91h5fmaico-0yrZE"}}

JSON 现在看起来像一个合适的 JSON 对象,但我的公主似乎在另一座城堡里。管道中是否还有其他我缺少的东西来启用它?

更新:

我终于明白了。结果是 AntiForgery token 导致了请求失败,如此处所述: POSTing complex JSON to ASP.NET Core Controller暂时删除它可以让我继续前进。谢谢!

最佳答案

您实际上并没有发送 2 个对象,您发送的是 1 个对象,其中包含 2 个其他对象。这就是这一行的内容,创建将被发送的单个对象。

data: JSON.stringify( { info: jsonObj, agreement: srFormJsonObj } ), // this is a single object that is created and sent by the http action

您需要在服务器上以相同的方式使用单个模型接收它,然后包含您当前用作方法参数的 2 种类型。

模型代码

public class Model{
public ApplicationInfoViewModel Info{get;set;}
public SRAgreementViewModel Agreement {get;set;}
}

Controller 代码

public IActionResult Apply([FromBody]Model model)
{
if(ModelState.IsValid){
//do stuff. ModelState.IsValid returns false here.
}
}

编辑

该错误可能是因为您在 json 对象中发送了 url 编码数据和 json。您应该使用其中之一,但不能同时使用两者。如果您查看最新更新,您会看到为属性 infoagreement 发送的值,它们是表单编码的字符串值。

关于c# - 在 .NET 核心中使用 Ajax 发布多个模型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41621543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com