【问题标题】:cannot pass paramerters as JSON to mvc controller无法将参数作为 JSON 传递给 mvc 控制器
【发布时间】:2023-04-02 16:55:01
【问题描述】:

我正在尝试将具有四个属性的 idobject 传递给动作控制器,但不幸的是它没有通过,我收到以下错误。

参数字典包含方法“System.Web.Mvc.JsonResult GetItems(Int32, Ebiquity.Reputation.Neptune.Web.Models.MyWorkFilterModel) 的不可空类型“System.Int32”的参数“batchID”的空条目)”在“Ebiquity.Reputation.Neptune.Web.Controllers.MyWorkController”中。可选参数必须是引用类型、可空类型或声明为可选参数。

参数名称:参数

传递的 JSON 是:

{
    "batchID": 21610,
    "filter":
    {
        "issueNo": "1",
        "messageNo": "2",
        "itemDate": "Wed, 05 Feb 2014 00:00:00 GMT",
        "mediaName":"3"
    }
};

ajax 调用:

self.GetItems = function (batchID, issueNo, messageNo, itemDate, mediaName) {

    var filter = {
        issueNo: issueNo,
        messageNo: messageNo,
        itemDate: itemDate,
        mediaName: mediaName
    };
        
    $.ajax({
        type: "GET",
        url: "/MyWork/GetItems",
        data: JSON.stringify({
            batchID: batchID,
            filter: filter
        }),
        dataType: "json",
        success: function (result) {

            self.Items([]);
            if (result.Items != null) {
                var tempItems = ko.mapping.fromJS(result.Items, mappingOptions);
                self.Items.push.apply(self.Items, tempItems());
            }
        }
    });
};

控制器:

[HttpGet]
public JsonResult GetItems(int batchID, MyWorkFilterModel filter)
{
    using (var rep = new WorkRepository(CurrentUser))
    {
        return Json(rep.GetBatch(batchID, filter), JsonRequestBehavior.AllowGet);
    }
}

过滤器模型:

public class MyWorkFilterModel
{
    public int? IssueNo { get; set; }
    public int? MessageNo { get; set; }
    public string MediaName { get; set; }
    public DateTime? ItemDate { get; set; }
}

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    看起来您的 batchID 为空。在 javascript 中将其设置为 0 或在操作中将其设置为 nullable

    [HttpGet]
    public JsonResult GetItems(int? batchID, MyWorkFilterModel filter)
    {
    
    }
    

    【讨论】:

    • batchID 为必填项,不为空,如果空值检查失败,不会传给控制器。
    【解决方案2】:

    我错过了 ajax 调用的 contenttype 属性,我使用 POST 而不是 GET 并且它有效。

    $.ajax({
                type: "POST",
                url: "/MyWork/GetItems",
                data: JSON.stringify({
                    batchID: batchID,
                    filter: filter
                }),
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                success: function (result) {
                    }
            });
    

    【讨论】:

      【解决方案3】:

      正如 Semao 所提到的,如果你想要那种 JSON,你需要使用 POST。由于您以这种方式发布 JSON,我猜您只是有一个错字并打算使用 POST。

      如果你真的想要 GET,你需要传递 URL 中的值。

      在您的情况下,您需要添加:

      [FromUri]
      

      在对象之前。

      例子:

      public class QueryObj
      {
          public int Id { get; set; }
          public string Name { get; set; }
      }
      
      public Result Get([FromUri] QueryObj queryObj)
      {...}
      
      http://.../query?Id=1&Name=test
      

      【讨论】:

        【解决方案4】:

        我们在这里有很多这样的讨论(见下面的链接)

        Posting JSON data via jQuery to ASP .NET MVC 4 controller action

        试试下面的 Ajax 数据类型:

        self.GetItems = function (batchID, issueNo, messageNo, itemDate, mediaName) {
        
            var filter = {
                issueNo: issueNo,
                messageNo: messageNo,
                itemDate: itemDate,
                mediaName: mediaName
            };
        
            $.ajax({
                type: "POST",
                url: "/MyWork/GetItems",
                dataType: 'text',
                data: "param=" + JSON.stringify({
                    batchID: batchID,
                    filter: filter
                }),
                success: function (result) {
                    self.Items([]);
                    if (result.Items != null) {
                        var tempItems = ko.mapping.fromJS(result.Items, mappingOptions);
                        self.Items.push.apply(self.Items, tempItems());
                    }
                }
            });
        };
        

        控制器

        [HttpPost]
        public JsonResult GetItems(String Param)
        {
        
        }
        

        【讨论】:

          【解决方案5】:

          您可以尝试将 IssueNo 和 MessageNo 设为整数而不是字符串。并使用POST 而不是GET

          如果您必须使用 GET,您可以仅将参数作为 url 的一部分传递!

          【讨论】:

            【解决方案6】:

            您必须将 AJAX 调用的类型更改为 POST 而不是 GET。数据参数不会随 GET 请求一起发送。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-06-08
              • 1970-01-01
              相关资源
              最近更新 更多