【问题标题】:$.getJSON call with null parameters to MVC controller action$.getJSON 使用空参数调用 MVC 控制器操作
【发布时间】:2010-11-27 02:23:39
【问题描述】:

我有一个带有以下操作代码的控制器:

public JsonResult CheckPasswordStrength(string password, string username, string firstname, string lastname)
{
   ...
   return this.Json(jsonResponse);
}

然后在我调用的页面上的 javascript 中

$.getJSON('http://localhost/site/controller/CheckPasswordStrength', { password: 'test', username: null, firstname: null, lastname: null }, function(data) {
    ...
});

问题是在我的 javascript 调用中为空的参数(名字、姓氏、用户名),在调用的控制器操作中它们不为空。它们具有字符串“null”值。我已经尝试在我的 javascript 中使用未定义的参数值,但它没有帮助。

如果我在我的 javascript 调用中仅指定不为 null 的参数(没有 null 参数),则我的操作中的参数将正确传输。

我应该如何在我的 $getJSON 调用中传递 null 参数,这些参数将被正确地传递给控制器​​操作,或者我应该在 MVC 端做什么?

【问题讨论】:

  • 当您将参数设置为未定义值时,它们是否也会将 ModelBinded 作为“未定义”字符串?
  • 是的,它们也有“未定义”值作为字符串

标签: jquery asp.net-mvc


【解决方案1】:

我假设您从某些表单字段的值构建此对象字面量。为什么不发布空字符串呢?如果您真的想将值留空,则根本不要传递它们,在发送之前从数据中去除空值:

function stripNull(obj) {
  for (var i in obj) {
    if (obj[i] === null) delete obj[i];
  }
  return obj;
}

$.getJSON('http://localhost/site/controller/CheckPasswordStrength', 
  stripNull({ password: 'test', username: null, firstname: null, lastname: null }), 
  function(data) {
   //...
});

虽然我建议不要使用其他人的框架并覆盖某些东西 - 你可以让 $.param 函数(这是 jQuery 用来将你的对象转换为查询字符串的函数)自动调用 stripNull

(function($) {
  // function stripNull() { ... }
  var oldParam = $.param;
  $.param = function(obj) { return oldParam.call(this, stripNull(obj)); }
})(jQuery);

如果您希望传递一个空字符串或其他一些“空标识符”(例如 \01),您仍然可以使用 stripNull() 但更改 delete obj[i]; --- obj[i] = '';

【讨论】:

  • 这与@Vincent 建议的答案基本相同,但包含代码......我真的不认为这是问题的解决方案。
  • 所有参数都会在URL中变成一个字符串。没有办法解决这个问题,因此您必须 a) 省略参数,b) 将其设置为您在控制器中检测到的某个特定值,即 'null' 甚至 \01
  • 问题是如何正确地将空值传递给服务器,以便它们绑定到实际的空值而不是“空”字符串
  • @gnarf:我很确定这是可能的。也许它需要创建一个自定义 ModelBinder,但我想应该是可能的。
  • 当 jQuery 组装其数据时,它使用一个名为 $.param 的辅助函数 - 该函数将 null 编码为字符串 'null'。我认为您可以轻松传递'' 或不传递参数。空表单字段默认为''...
【解决方案2】:

如果 $.getJSON 为空,你不能只调用不带用户名参数的 $.getJSON 吗?

我的意思是,当您不想检查密码的强度时,您真的需要传递用户名、名字...吗?

【讨论】:

  • 它使代码更简单地包含 JSON 对象中的所有值,因为否则他应该检查每个值并在其中添加非空值。我想他在问如何正确地将空值传递给服务器而不是如何省略它们。 :)
猜你喜欢
  • 2014-02-21
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 2015-04-16
  • 2011-01-01
相关资源
最近更新 更多