首页 > 解决方案 > HttpPost 控制器参数 null ASP.NET CORE MVC

问题描述

我正在为模态对话框上的按钮编写一个 javascript 函数。按钮的代码是:

<button type="button" class="btn btn-sm btn-outline-secondary" id="clone" onclick="clone(null, @Model.Id,@Model.CloneId)">Clone</button>

单击按钮时,我有一个onclick 函数:

function clone(e, Id, CloneId) {

var valuesetName = $("#newValueSet").val();

var data = JSON.stringify({ 'id': Id, 'cloneId': CloneId, 'newValueSet': valuesetName });

$.ajax({
    type: "POST",
    url: '/Tests/Clone',
    data: data,
    contentType: "application/json; charset=utf-8"
    success: function () { }
});

}

动作方法是:

[HttpPost]
public ActionResult Clone([FromBody]EditModel model)
{
    //logic
}

模型类是:

public class EditModel
{
    public long Id { get; set; }
    public long CloneId { get; set; }
    public string ValueSetName { get; set; }
}

当我尝试调试此代码时,AJAX 函数会正确获取值,但不会将它们传递给 ActionMethod。这可能是什么原因?任何指针都会有所帮助。提前致谢!

标签: javascriptajaxasp.net-coreasp.net-core-mvchttp-post

解决方案


来自女士文档:

使用 [FromBody] 强制 Web API 从请求正文中读取简单类型,将 [FromBody] 属性添加到参数

这意味着如果你使用 FromBody 你只能传递原始参数:

[HttpPost]
public ActionResult CloneValues([FromBody]string text)
{
    //logic
}

你需要的是 FromUri

使用 [FromUri] 要强制 Web API 从 URI 中读取复杂类型,请将 [FromUri] 属性添加到参数中。以下示例定义了 GeoPoint 类型,以及从 URI 获取 GeoPoint 的控制器方法。

[HttpPost]
public ActionResult CloneValues([FromUri]EditModel model)
{
    //logic
}

推荐阅读