javascript - 对 ASP.NET MVC Controller 的 JQuery JSON POST 请求未到达端点,但手动使用路由工作正常

标签 javascript jquery asp.net asp.net-mvc

我有一个 ASP.NET 应用程序,它由一个前端组成,其中包含一个表单,我希望将其数据传递到我的 C# 后端。为此,我使用 JQuery post 请求来序列化表单数据并使用 JSON 将其发送到 Controller 。下面是我调用 Controller 路由的 Javascript 代码;

$(".data-submit").on("click",
        function(event) {
            var formArray = $("#amend-form").serializeArray();
            var json = JSON.stringify(formArray);

            $.post(windowLocationOrigin() +
                "/Instruction/AmendData", 
                json, 
                function (data) {
                    alert("api endpoint called");
                });

        });

这里是被调用的 Controller 端点

        [Route("[controller]/AmendData")]
        public IActionResult AmendPortingData([FromBody] string json)
        {
            return Ok(json);
        }

当我通过前端提交此表单时,将调用 onClick JS 事件并发送 post 请求,但 Controller 端点永远不会被命中。我在 return Ok(json) 上有一个断点提交表单后永远不会触发的行。

如果我检查开发人员工具,则会收到 500 错误,并显示消息:POST https://localhost:44358/Instruction/AmendData 500

但是,如果我随后向此网址 https://localhost:44358/Instruction/AmendData?json=123 提交请求终点被正确击中,我可以看到值 123在我的调试器中。

但是,我希望能够通过 post 请求正文发送数据,而不是通过 url 发送数据,因为提交的表单很大,并且包含太多需要通过 GET 发送的数据。

我尝试添加 [HttpPost]属性到 Controller 端点,但这会产生完全相同的行为,只是它不允许 GET url 工作。

最佳答案

您的 Controller 操作:

public IActionResult AmendPortingData(string json)

需要一个名为json的参数。

当你用以下方式调用它时:

 $.ajax({ url: url, data: "string" });

传递的数据没有参数名称,因此默认模型绑定(bind)器无法确定将数据的哪一部分应用于该参数。

这适用于:

http://url?json=string

当您指定参数名称?json=时,如果您使用以下方式调用操作

http://url/string

然后它会再次无法将“string”识别为参数“json”并且不起作用(尽管可能会给您一个更有用的“无法找到参数数据”错误)(当然假设没有额外的路由)。

通过为字符串参数指定名称,默认模型绑定(bind)器将能够将字符串与参数名称相匹配:

$.ajax({ url: url, data: { json: "string" }});
<小时/>

另一种方法是添加一个模型绑定(bind)器,它将接受任何 POST 字符串并将其传递给单个参数 - 但上面的方法通常更干净且更易于维护。

<小时/>

添加 [HttpPost] 将操作限制为该动词(因此,顺便说一句,添加 [HttpPost][HttpGet] 会使其无法使用,因为它必须是 POST并且必须是 GET)。

<小时/>

如果您从 View 模型构建表单,那么您可以直接在操作中使用该 View 模型:

public ActionResult MyAction(MyViewModel viewmodel)

并直接传递:

$.ajax({ url: url, data: $("form").serialize() });

默认的模型绑定(bind)器会将您的输入名称映射到 View 模型上的属性。

关于javascript - 对 ASP.NET MVC Controller 的 JQuery JSON POST 请求未到达端点,但手动使用路由工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55040251/

相关文章:

javascript - 无法将类作为函数调用

javascript - 街道地址的简单正则表达式

asp.net - 在 ASP.NET 中缓存链接页面

javascript - ReferenceError : 'x' is not defined - asp.net mvc 局部 View 和 jQuery/JavaScript - 将整个模型传递给操作方法

javascript - 返回 ion-item 的 ajax 数据循环

javascript - gulp uncss 正在过滤我的 javascript 所需的选择器

asp.net - 在 WCF 中支持 Mtom 和 Text 作为 MessageEncoding

javascript - 如何在编码中更改谷歌翻译选择语言文本

javascript - 我的 asp.net mvc View 中的 JQueryUI Datepicker

c# - DropDownlistFor MVC 4 中的 Optgroup?