使用JQuery Ajax向asp.net MVC控制器提交多个复杂对象

5

您好,

我在向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

我已经花了好几个小时在尝试序列化一个简单的域对象和另一个布尔类型参数并传递给我的控制器,但却一直没有进展。你有什么建议吗?


我尝试的下一件事是创建一个类似于SaveObjectRequest的SaveObjectRequestObject,它继承自DomainObject{ public bool AnOption{get;set;} }。这实际上已经跟踪到了控制器,但我的基本对象属性从未被设置。 - Ross Bush
1个回答

5

看起来您在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/):

application/x-www-form-urlencoded; charset=UTF-8


事实证明,当我将控制器请求对象展开后,我可以追踪到控制器。然后删除返回JSON.stringify({request: SaveDomainObjectRequest});,只返回someDomainObjectRequest就可以了。我会将您的回复标记为答案,但是我没有时间回退和测试:( - Ross Bush
这个回答解决了我的问题。由于某种原因,jQuery的默认设置对于我的MVC控制器绑定复杂集合并不够好。简单地发送JSON变量(如本帖所述)使一切都完美地绑定。非常感谢! - Mr. S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接