【问题标题】:JQuery Ajax and Posting multiple complex objects to asp.net MVC ControllerJQuery Ajax 并将多个复杂对象发布到 asp.net MVC 控制器
【发布时间】:2012-11-28 03:35:44
【问题描述】:

`您好,

将多个参数发布到 mc 控制器方法时出现问题。

controller...
[HttpPost]
public ActionResult SaveSomething(SomeDomainObject domainObject, bool anOption)
{
}

Ajax Code...
function performPostData(postDataOptions,closeWindow) {
        $.ajax({ type: postDataOptions.httpVerb,
            url: postDataOptions.url,
            datatype: "json",
            traditional: true,
            data: postDataOptions.data(),
            success: function () {
                if (closeWindow) {
                    var window = $('#window').data("kendoWindow");
                    window.close();             
                }
            },
            error: function (xhr, status, error) {
                var msg = JSON.parse(xhr.responseText);
                var validator = $("#editBase").kendoValidator().data("kendoValidator"),
                status = $(".editValidationStatus");
                var err = msg.Message;
                status.text(err).addClass("invalid");
            }
        });
    }

JScript function to format data...

function GetPostData()
{
    var _domainObject={            
            prop1: 1,
            prop2: 2,
            prop3: 3                      
        };
        return JSON.stringify({ domainObject:_domainObject,anOption: true});
}

我在网络捕获中看到这是请求正文:

{"domainObject":{"prop1":1,"prop2":2,"Prop3":3},"anOption":true}

控制器引发以下异常:

The parameters dictionary contains a null entry for parameter 'anOption' of non-nullable type 'System.Boolean' for method 'System.Web.Mvc.ActionResult SaveSomething(Domain.Data.SomeDomainObject, Boolean)' in 'Reports.Controllers.TestController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

我已经旋转了几个小时,试图获取一个简单的域对象和另一个 bool 类型的参数来序列化并传递给我的控制器。有什么想法吗?

【问题讨论】:

  • 接下来我尝试创建一个 SaveObjectRequestObject,例如 SaveObjectRequest:DomainObject{ public bool AnOption{get;set;}}。这实际上追溯到控制器,但我的基础对象属性从未设置。

标签: ajax asp.net-mvc


【解决方案1】:

看起来您在 jquery ajax 调用中缺少内容类型参数。 您应该将其显式设置为 json,就像在这段代码中一样:

function performPostData(postDataOptions,closeWindow) {
    $.ajax({ type: postDataOptions.httpVerb,
        url: postDataOptions.url,
        datatype: "json",
        contentType: "application/json; charset=utf-8",

        ...rest of your code

否则它会得到它的默认值(见http://api.jquery.com/jQuery.ajax/):

应用程序/x-www-form-urlencoded; charset=UTF-8

【讨论】:

  • 事实证明,在我将控制器请求对象展平后,我可以追踪到控制器。然后删除返回 JSON.stringify({ request: SaveDomainObjectRequest});并且只返回 someDomainObjectRequest 有效。我会将您的回复标记为答案,但是,我没有时间回复和测试:(
  • 这个答案解决了我的问题。出于某种原因,jQuery 默认值不足以让我的 MVC 控制器绑定复杂的集合。只需发送 JSON 变体(如本文所述)即可完美绑定所有内容。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2021-11-07
  • 2013-07-03
  • 2014-03-01
  • 1970-01-01
  • 2013-02-25
相关资源
最近更新 更多