ASP.NET MVC 核心 POST 请求未将 JSON 数据转换为模型
Posted
技术标签:
【中文标题】ASP.NET MVC 核心 POST 请求未将 JSON 数据转换为模型【英文标题】:ASP.NET MVC core POST Request not converting JSON data to Model 【发布时间】:2018-03-09 12:10:28 【问题描述】:我有一个模型,我序列化到屏幕上并与 Vue.js 一起使用。屏幕/模型更改后,我使用 axios 将 POST 请求返回到我的 ASP.NET Core (2.0) 控制器。到目前为止,在我的 Controller 中评估我的自定义模型时,尝试的每个组合都会导致所有空值。任何建议将不胜感激。
型号:
[Serializable]
public class ClientsWebsite
[Key]
public string ClientID get; set;
public string CustomSiteScript get; set;
public string WebsiteName get; set;
public string FormName get; set;
public string SliderImagePath get; set;
public string MessageHeader get; set;
public string CallToActionMessage get; set;
Vue 和 POST 调用:
var sliderApp = new Vue(
el: '#sliderApp',
data:
ClientsWebsite: [],
axajLoaded: false,
picked: []
,
created: function ()
getUserSettings()
)
function saveCustomSettings()
axios.post('/Slider/Slider/SaveCustomSettings',
vm: sliderApp.ClientsWebsite
)
.then(function (response)
console.log(response);
)
.catch(function (error)
console.log(error);
);
控制器:
[HttpPost]
public string SaveCustomSettings(ClientsWebsite vm)
if (ModelState.IsValid)
//stuff...
return "Success";
我也尝试在我的 javascript POST 调用中使用 JSON.stringify,没有任何变化。
POST Header Request Payload 的结果:
"ClientsWebsite":"ClientID":"6056e4a8-32a8-4042-b750-50c609edf140","CustomSiteScript":"someScriptHere","WebsiteName":"Blah.com","FormName":"Contact1","SliderImagePath":"ContactUs3","MessageHeader":"Hello, please send us a message","CallToActionMessage":"We will respond ASAP!!!!!"
更新: 解决方案来自以下两个答案的组合。
【问题讨论】:
【参考方案1】:您的模型周围有一个对象:
"ClientsWebsite":"ClientID":"6056e4a8-32a8-4042-b750-50c609edf140","CustomSiteScript":"someScriptHere","WebsiteName":"Blah.com","FormName":"Contact1","SliderImagePath":"ContactUs3","MessageHeader":"Hello, please send us a message","CallToActionMessage":"We will respond ASAP!!!!!"
删除它:
"ClientID":"6056e4a8-32a8-4042-b750-50c609edf140","CustomSiteScript":"someScriptHere","WebsiteName":"Blah.com","FormName":"Contact1","SliderImagePath":"ContactUs3","MessageHeader":"Hello, please send us a message","CallToActionMessage":"We will respond ASAP!!!!!"
对于你的功能:
function saveCustomSettings()
axios.post('/Slider/Slider/SaveCustomSettings',
sliderApp.ClientsWebsite
)
.then(function (response)
console.log(response);
)
.catch(function (error)
console.log(error);
);
【讨论】:
更改 POST 请求从字符串中删除了“ClientWebsite”。我根据您的更改比较了加载到屏幕上的 GET 请求对象和 POST 请求,并且对象完全相同。但是在控制器中,我所有的对象仍然是空的。 如果你想改变post-Request本身,你也必须删除第一个和最后一个大括号。 请求很好,与您现在在上面显示的方式相匹配。 你还有vm==null吗? vm 不是 Null,但是 vm 内的所有属性仍然是 null。【参考方案2】:除了 Nikolaus 所说的,尝试在 ClientsWebsite vm 之前添加 [FromBody]。
[HttpPost]
public string SaveCustomSettings([FromBody]ClientsWebsite vm)
if (ModelState.IsValid)
//stuff...
return "Success";
【讨论】:
你的两个答案都是解决方案!以上是关于ASP.NET MVC 核心 POST 请求未将 JSON 数据转换为模型的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET 核心 mvc 向 asp.net 核心中的 Web API 发出 PUT 请求?
如何使用 Angular 2 在 POST 上启用 ASP.NET MVC 4 中的跨源请求
如何将两个数组作为 POST 请求参数从 AJAX 发送到 MVC 控制器(ASP .NET Core 3.1 剃须刀)?
ASP.NET MVC API与JS进行POST请求时传递参数 -CHPowerljp原创