【问题标题】:Error sending data with Ajax and receiving in controller使用 Ajax 发送数据并在控制器中接收时出错
【发布时间】:2020-02-26 17:28:28
【问题描述】:

我正在发送 Json 数据,但是当我在控制器中验证我的方法时,它以 null 的形式到达

html:

<div class="hijo">
                    @Html.LabelFor(m => m.Proyecto, new { @class = "", style = "color:#040404" })
                    @Html.DropDownListFor(Model => Model.ProyectoID, Model.Proyecto, "Seleccionar")
                    @Html.ValidationMessageFor(Model => Model.Proyecto, null, new { @class = "label label-danger", id = "Proyecto" })
                </div>
<div class="hijo">
                    <input type="button" id="adicionar" value="Agregar" class="myButton">
                </div>

JS:

$('#adicionar').click(function () {
        debugger;
        var data= {
        Proyecto: $("#ProyectoID option:selected").text()
    };
    $.ajax({
        url: "../ManejoDatos",
        type: "POST",
        dataType: "json",  
        data: JSON.stringify(data),
        success: function (mydata) {
            $("#UpdateDiv").html(mydata);
            history.pushState('', 'New URL: ' + href, href); // This Code lets you to change url howyouwant
        }
    });
 }

我的控制器

public JsonResult ManejoDatos(string Proyecto)
    {
         ........
         ...
        return Json(Proyecto);
    }

控制台

我不知道它是否很容易修复,但我没有看到错误

问候

【问题讨论】:

  • 它会击中你的控制器吗?
  • 在控制器中它作为空值到达

标签: javascript c# ajax


【解决方案1】:

我发现您的JavaScript 代码绝对没问题。奇怪的是,您的格式的控制器无法正常工作,但我通过以下方式取得了成功:

        [System.Web.Http.HttpPost]
        public HttpResponseMessage ManejoDatos(string Proyecto)
        {
            var data = " my test data ";
            return Request.CreateResponse(HttpStatusCode.OK, data);
        }

我显然会调查并再次更新答案。

希望以上想法能帮助您解决问题。如果您遇到任何问题,请告诉我。

【讨论】:

  • 已经尝试将值Project:" Test " 发送给控制器,但如果为空
  • 你能分享你的HTML 特别是#adicionar
  • 准备编辑问题,添加数据的来源
  • 我注意到了,找到问题了
  • 添加控制台照片
【解决方案2】:

string,int,float 等简单类型将从 .Net 框架中的查询字符串中获取,而复杂类型总是从正文中获取。

解决方案 1

在这种情况下,.Net Framework 期望来自查询参数的字符串 Proyecto,您可以像这样调用您的 API,而无需对服务器端代码进行任何更改

注意:你也不需要定义参数的键(在http请求中),它被定义为[From Body]。总共可以使用[FromBody] 属性传递一种简单类型,您可以在下面看到这样的=ProyectoValue

POST ../ManejoDatos HTTP/1.1
Host: localhost:59353
Content-Type: application/x-www-form-urlencoded
=ProyectoValue

解决方案 2

或者您可以通过将所有参数放入复杂模型中来调用您的 API,并通过正文而不是像这样的查询参数传递参数

复杂类型模型

public class MyModel
    {
        public string Proyecto{ get; set; }
    }

API 代码

public JsonResult ManejoDatos(MyModel myModel)
    {
         //Access using mymodel.Proyecto
         ........
         ...
        return Json(mymodel.Proyecto);
    }

现在您可以像这样通过 body 传递参数来使用您的 API

POST ../ManejoDatos HTTP/1.1
Host: localhost:59353
Content-Type: application/x-www-form-urlencoded

proyecto=myproyecto

【讨论】:

  • 我已经尝试了您在此处编写的所有方法。但没有奏效。你可以看看。
  • 在评论中很难让你理解我试过[System.Web.Http.HttpPost] public JsonResult NewRndMethod([FromBody]MyClass Name) { return Json(Name); }
  • 这个[System.Web.Http.HttpPost] public ActionResult NewRndMethod([FromBody]MyClass Name) { return Json(Name); }
  • [HttpPost("[action]")] [Route("TestMethod")] [ActionName("TestMethod")] public ActionResult&lt;myClass&gt; TestMethod([FromBody]myClass param) { return param; }
  • 您不需要像使用 NewRndMethod 那样使用复杂类型的 [FromBody]。考虑改变它
猜你喜欢
  • 2013-08-21
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2020-06-08
  • 2017-04-29
  • 1970-01-01
  • 2016-08-02
  • 2019-01-06
相关资源
最近更新 更多