2017-07-26 150 views
0

我是ASP.NET Core的新手,我试图将视图模型发布到我的控制器(我认为)。在ASP.NET核心中使用JSON发布模型到控制器

型号:

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(":("); 
     } 
    }); 
} 

我目前能得到A B在我的控制器中的reak点,但模型值为null。我尝试过这个过程的各种组合,包括将[FromBody]添加到控制器参数中。当我添加[FromBody]时,我根本没有达到我的断点,请求只是失败,并且出现错误:“找不到元素”。

起初我尝试将我的ToolModel模型传递给我的索引控制器中的视图,但我无法弄清楚如何将我的视图中的数据连接到模型(我试过设置@ Model.text =“test “没有成功)。这不起作用,所以我只是将模型复制为一个javascript对象。根据我读过的内容,当我发布json时,它应该自动绑定到我的模型上?

我对ASP.NET Core非常陌生,我甚至不知道该怎么去google,并且这篇文章的每一个变体都失败了。我如何从我的视图中获取数据到我的控制器,使用我的模型,通过ajax?每个人似乎都以不同的方式做。

+0

装饰使用[DataContract]您ToolModel类和[DataMember]标注每个属性。仅在方法签名中的ToolModel前面添加[FromBody],然后重试。 –

+0

我试过这个,并得到相同的“找不到元素”错误和ajax错误。 – Sunden

回答

2

由于您通过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); 
} 

在clent方面,您需要指定contetType标头,以便服务器知道它正在接收的类型以及如何处理它。在您的ajax调用中指定“application/json”作为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

谢谢。我可以发誓我试着搞乱contentType,但这工作表示感谢。 – Sunden

1

我看到的是你有模型参数在后功能。如果你不提供它,它将是null

理想情况下,您不需要在URL中使用/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); 
} 

enter image description here

相关问题