代码之家  ›  专栏  ›  技术社区  ›  Phil.Wheeler

更多Ajax/MVC问题

  •  1
  • Phil.Wheeler  · 技术社区  · 15 年前

    这是StackOverflow上一个经常出现的主题,但我再一次无法让MVC控制器动作识别我要发送的数据。感谢您的建议。

    我的控制器操作如下:

            [Authorize]
            [HttpPost]
            public JsonResult Record(int task, string notes, double hours)
            {
                Repository<TimeEntry> TimeRepo = new Repository<TimeEntry>();
                ...
    

    我的Ajax调用如下:

    var Task = $('#time-task option:selected').val();
    var Hours = parseFloat($('#time-hours').val());
    var Notes = $('#txtNotes').val();
    
    if (isNaN(Hours)) {
        Hours = 0;
    }
    
    $.post('/Home/Record', { task: Task, notes: Notes, hours: Hours }, function (data) {
        console.log(data);
    });
    

    返回的异常是:

    参数字典包含 的参数“task”的条目为空 的不可为空的类型“System.Int32” 方法'system.web.mvc.jsonresult 记录(int32,system.string,double)' 在里面 “jobtrack.controllers.homecontroller”。 可选参数必须是 引用类型、可为空的类型或be 声明为可选 参数。
    参数名称: 参数

    必须有一些基本的东西我忽略了,但如果我能找出我的错误。感谢您的建议。

    更新:因此,将$.Post更改为$.Ajax调用,并让该调用使用get而不是post似乎可以工作。我想我可以忍受,但我宁愿做得正确。关于为什么HTTP动词应该起作用有什么建议吗?

    6 回复  |  直到 15 年前
        1
  •  1
  •   Dave Ward    15 年前

    如果将任务参数声明为可空,会发生什么情况,例如:

    public JsonResult Record(int? task, string notes, double hours)
    

    它能消除错误吗?是 任务 如果在调用期间调试该代码,则为空?

        2
  •  1
  •   jeroenh    15 年前

    试着通过简化来消除。此代码(在我的计算机上)工作:

    控制器动作:

        public JsonResult TestJson(int someInt, string someString, double someDouble)
        {
            return Json(new object[]
                {
                    someInt,
                    someString,
                    someDouble
                });
        }
    

    在我看来,我补充道:

    <a id="testJson">testJson</a>      
    

    <script type="text/javascript">
        $("#testJson").click(function() {
            $.post('/Home/TestJson', 
                  { someInt: 1, someString: 'foo', someDouble: 1.1}, 
                  function(data) {
                      alert(data);
                  });
        });    
        </script>
    
        3
  •  0
  •   Fenton    15 年前

    你似乎已经走上了正确的道路——它认为你没有传递一个可以转换为int的任务。

    var Task = $('#time-task option:selected').val();
    var Hours = parseFloat($('#time-hours').val());
    var Notes = $('#txtNotes').val();
    
    if (isNaN(Task)) {
        Task = 0;
    }
    
    if (isNaN(Hours)) {
        Hours = 0;
    }
    
    $.post('/Home/Record', { task: Task, notes: Notes, hours: Hours }, function (data) {
        console.log(data);
    });
    

    如果在这一微小的更改之后仍然有问题,那么在添加变量之前,您可能需要调用具有固定参数的方法来测试您的调用。

    $.post('/Home/Record', { task: 1, notes: "Hello World", hours: 2 }, function (data) {
        console.log(data);
    });
    
        4
  •  0
  •   Mark    15 年前

    “时间任务”下拉列表在页面加载时是否有“选定”值?否则,任务变量将为空。

    我想说你需要做两件事:

    1. 在路由、控制器方法或jquery脚本中为任务设置默认值
    2. 然后“parsefloat”是“task”的值,因为它是控制器方法上的“int”类型。
        5
  •  0
  •   ebrown    15 年前

    尝试将数据类型显式发送为json,如下所示:

    $.post('/Home/Record', { task: Task, notes: Notes, hours: Hours }, function (data) {
        console.log(data);
    }, 'json');
    
        6
  •  0
  •   Phil.Wheeler    15 年前

    啊!

    我知道这是我忽略了的基本问题。

    问题的根本原因是/scripts/globals.js文件,我甚至都没有看过(而且几乎完全忘记了)。其中,我有以下代码:

    $.ajaxSetup({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: "{}",
        dataFilter: function(data) {
            var msg;
    
            if (typeof (JSON) !== 'undefined' &&
            typeof (JSON.parse) === 'function')
                msg = JSON.parse(data);
            else
                msg = eval('(' + data + ')');
    
            if (msg.hasOwnProperty('d'))
                return msg.d;
            else
                return msg;
        }
    });
    

    问题是什么?ContentType。我对根本原因的理解是,由于我使用的是jquery 1.4,因此内容类型是自动正确确定的(“application/x-www-form-urlencoded”),并且在全局设置中再次明确定义它,一定会混淆某些内容。

    感谢所有为这个解决方案做出贡献的人。如果有人知道ContentType导致jQuery中的Ajax文章失败的原因,我想进一步了解一下。