【问题标题】:What is the right type in ajax function when use .NET MVC使用 .NET MVC 时,ajax 函数的正确类型是什么
【发布时间】:2017-05-31 23:30:32
【问题描述】:

最近,当我将我的一个.NET Framework 应用程序迁移到.NET Core 1.1.Howerver 时,我遇到了一个问题,当我在视图中使用Ajax 调用Controller 方法时,我发现Controller 无法接收参数。我不解。任何人都可以帮助我解决这个问题。详情如下:

这是 .NET Core 中的代码:

视图(html):

<input id="btnSubmit" type="button" style="font-size: 14px; padding: 2px 4px;" 
       value="OK,Submit!" />

控制器(C#):

[NeedLogin]
public async Task<string> AddQuestion(QuestionItem qes)
{
    //...
}

QuestionItem 是实体对象。

$.ajax({
        type: 'post',
        data: '{"qes":' + JSON.stringify(question) + '}',
        url: '/q/AddQuestion',
        dataType: 'Text',
        success: function (data) {
            if (data.indexOf("Add Failed") !== -1) {
                showDialogCustom("Tips", data);
                $("#btnSubmit").prop("disabled", false).val("Ok,Commit!");
            } else {
                if (!$("#txtQuestionMarkdown").length) {
                    tinyMCE.get('txtContent').setContent("");
                }
                $("#txtQuestion,#mySingleField").val("");
                jutil.storage.deleteStorage("q_t");
                jutil.storage.deleteStorage("q_c");
                if (question.SaveOption) {
                    window.top.location.href = "/q/SaveDraftSuccess?qid=" + data;
                } else {
                    window.top.location.href = "/q/success?qid=" + data;
                }
            }
        },
        error: function (msg) {
            showDialogCustom("Wrong!", msg.responseText);
            $("#btnSubmit").prop("disabled", false).val("Ok,Commit!");
        }
    });

我想知道为什么我的控制器无法在 .NET Core 应用程序中接收 qes 参数? 我在 .NET Framework 应用程序中成功运行它。 数据或数据类型应该是什么?

【问题讨论】:

  • 您登录了吗? NeedLogin 是否通过?此外,您应该将 dataType 更改为 application/JSON 而不是 text(因为它 is JSON)。您可能还必须在方法上指定[HttpPost],在参数上指定[FromBody] ([FromBody] QuestionItem qes)
  • 是的,我登录了,我也调试了,当我调试到这个控制器方法时。参数 qes 为空。但我使用Chrome Developer Tools 发现qes 不为空。所以我猜它可能是 dataType 和 ContentType。昨晚,我将数据类型更改为application/json,添加[HttpPost][FromBody]。它不起作用。
  • 什么都没有(就您所展示的而言)。您的代码在任何版本的 MVC 中都无法正常工作。你的question 对象是什么?
  • 抱歉,我在$.ajax 代码前面隐藏了一些代码,question 对象中的一些属性是从用户输入中获取的。

标签: c# ajax asp.net-core asp.net-core-mvc .net-core


【解决方案1】:

在最后几个小时,我继续调试我的问题,感谢@Rob。我找到了以下解决方案:

Controller(C#)
 [HttpPost]
 [NeedLogin]
 public async Task<string> AddQuestion([FromBody] QuestionItem qes)
 {
  //...
 }

在Js下面:

  js
       data: JSON.stringify(question)),
       type: 'post',
       dataType: 'json',
       contentType: 'application/json; charset=utf-8'

现在,控制器正确接收参数。

供应:最近,当我将我的项目迁移到.NET Core 时,我发现很多错误,就像我在问题中所说的那样。我发现我之前描述的答案不正确。因为我发现我的项目没有提交通过Form。它使用 Ajax。答案是 ContentType 在我的 ajax 函数中

  JS
   data: question,*
   type: 'post',
   dataType: 'json',
   contentType: 'application/x-www-form-urlencoded; charset=UTF-8'*

终于解决了我的问题!

【讨论】:

  • [FromBody][HttpPost] 的默认值,在这种情况下不需要
  • 而您只需要data: question 并省略contentType: 'application/json; charset=utf-8'
  • 让我试一试。谢谢。
  • 我按你说的测试我的项目,当我删除[FromBody] 并且控制器无法接收参数时。所以需要[FromBody]。然后,我添加 [FromBody] 并省略 contentType: 'application/json; charset=utf-8' 。它运行成功。谢谢你了。
  • @Rob,如果 ajax 调用发送默认的 contentType: application/x-www-form-urlencoded; charset=UTF-8(并且未字符串化),则不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
相关资源
最近更新 更多