我是ASP.NET Core的新手,我试图将视图模型发布到我的控制器(我认为)。
型号:
public class ToolModel
{
public ToolModel() { }
public string text { get; set; }
public string type { get; set; }
public string name { get; set; }
}
控制器
[HttpPost("/Utilities/Tool/{type}/{process}")]
public IActionResult ToolProcess(ToolModel model, string type, string process)
{
var test = model.text;
var result = new Services.ToolServices().exec(model, type, process);
return Ok(result);
}
查看
var model = {
text: "Test_text",
type: "test",
name: "test_name"
}
function post(model) {
var url = '/Utilities/Tool/Test/Edit';
$.ajax({
url: url,
data: JSON.stringify(model),
type: 'POST',
success: function () {
alert("all good");
},
error: function () {
alert(":(");
}
});
}
我目前能够在控制器内到达断点,但模型值为空。我尝试过这个过程的各种组合,包括将[FromBody]添加到控制器参数中。当我添加[FromBody]时,我根本没有到达断点,请求失败,我收到错误:"找不到元素"。
起初我尝试将我的ToolModel模型传递到我的索引控制器中的视图,但我无法弄清楚如何将数据从我的视图连接到模型(我尝试设置 @ Model.text ="测试" 没有成功)。这没有用,所以我只是将模型复制为javascript对象。根据我读过的内容,当我发布json时,它应该自动绑定到我的模型上?
我是ASP.NET Core的新手,我甚至不知道谷歌的内容,而且帖子的每个变体都不适合我。如何使用我的模型,通过ajax从我的视图中获取数据到控制器?每个人似乎都采用不同的方式。
答案 0 :(得分:3)
由于您是通过POST请求发送数据,因此数据将在请求正文中发送。所以你应该指示MVC框架从请求体中读取它。您可以使用[FromBody]
属性修饰参数。
此外,删除type
参数,因为您的ToolModel类具有相同名称的属性。您也可以从属性路径定义中删除它。
[HttpPost("/Utilities/Tool/{process}")]
public IActionResult ToolProcess([FromBody] ToolModel model, string process)
{
var test = model.text;
var result = model;
// to do : Add your custom code here
return Ok(result);
}
简而言之,您需要指定contetType标头,以便服务器知道它接收的类型以及如何处理它。将“application / json”指定为ajax调用中的contentType值。
var url = '/Utilities/Tool/Edit';
$.ajax({
url: url,
data: JSON.stringify(model),
contentType:"application/json",
type: 'POST',
success: function (r) {
alert("all good");
console.log(JSON.stringify(r));
},
error: function () {
console.log('errr');
}
});
答案 1 :(得分:1)
我看到你在post函数中将 模型 作为 参数 。如果您不提供,则 null 。
理想情况下,您不需要在网址中/Test/Edit
,因为它们已经在正文中。
以下是我测试的方法 -
<button type="button" onclick="post();">Post Data</button>
<script>
var model = {
text: "Test_text",
type: "test",
name: "test_name"
}
function post() {
var url = '/Utilities/Tool';
$.ajax({
url: url,
data: JSON.stringify(model),
type: 'POST',
contentType: "application/json",
success: function() {
alert("all good");
},
error: function() {
alert(":(");
}
});
}
</script>
[HttpPost("/Utilities/Tool")]
public IActionResult ToolProcess([FromBody]ToolModel model)
{
model.text += "Return From Server";
return Ok(model);
}