JQuery Ajax和ASP.NET MVC3导致null参数

时间:2011-04-18 05:31:59

标签: jquery ajax asp.net-mvc-3

这个问题已被多次询问,但我找到的解决方案似乎都没有起作用。让我觉得这可能是一个新问题,也许是ASP.NET MVC 3特有的东西。

我正在使用JQuery Ajax对ASP.NET MVC 3控制器进行简单调用。像这样

var addressInfo = { 
    Address1: "423 Judy Road",
    Address2: "1001",
    City: "New York",
    State: "NY",
    ZipCode: "10301",
    Country: "USA" 
};

$.ajax({
    url: '/home/check',
    type: 'POST',
    data: JSON.stringify(addressInfo),
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    success: function () {
        alert("success");
    },
    error: function () {
        alert("error");
    }
});

控制器看起来像这样

[HttpPost]
public ActionResult Check(AddressInfo addressInfo)
{
    // Do something and return Json(something)
}

这不起作用,但它应该基于Scottgu的post

的“JavaScript和AJAX改进”部分

我尝试了很多不同的变体,例如:

var args = new Object();
args.addressInfo = { 
    Address1: "423 Judy Road",
    Address2: "1001",
    City: "New York",
    State: "NY",
    ZipCode: "10301",
    Country: "USA" 
};

$.ajax({
    url: '/home/check',
    type: 'POST',
    data: JSON.stringify(args),
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    success: function () {
        alert("success");
    },
    error: function () {
        alert("error");
    }
});

然后以上两个都直接使用JSON对象:

$.ajax({
    url: '/home/check',
    type: 'POST',
    data: args,
    success: function () {
        alert("success");
    },
    error: function () {
        alert("error");
    }
});

没有工作。如果我只有一个字符串,我传递给控制器​​,这是有效的。但是一旦我介绍了一个对象,我就无法让它工作。

任何人都知道可能是什么问题。

非常感谢您对此进行调查!

4 个答案:

答案 0 :(得分:4)

您的代码似乎很好,它应该工作。我刚刚在新应用程序中测试了以下内容而没有任何问题。

型号:

public class AddressInfo 
{
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string ZipCode { get; set; }
    public string Country { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Check(AddressInfo addressInfo)
    {
        return Json(new { success = true });
    }
}

查看:

<script type="text/javascript">
    var ai = {
        Address1: "423 Judy Road",
        Address2: "1001",
        City: "New York",
        State: "NY",
        ZipCode: "10301",
        Country: "USA"
    };

    $.ajax({
        url: '/home/check',
        type: 'POST',
        data: JSON.stringify(ai),
        contentType: 'application/json; charset=utf-8',
        success: function (data) {
            alert(data.success);
        },
        error: function () {
            alert("error");
        }
    });
</script>

答案 1 :(得分:1)

您需要的是ValueProvider。

您可以阅读有关ValueProviders herehere的信息。

此ValueProvider使用默认的JavaScriptSerializer

选取已发布的Json并填充Action方法参数
ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

您可以在Global.asax.cs中添加该行,以便在应用程序启动时执行一次。您刚刚告诉默认的Model Binder将传入的Json绑定到Models。在内部,JsonValueProvider只是一个字典值提供者,比如UrlValueProvider,只有它根据你发布的Json构造字典。 MVC团队的一个巧妙的实现。 GJ MVC团队。

答案 2 :(得分:1)

感谢您上面的回复,但示例不太正确。以下是客户端代码的外观:

        jQuery.ajax({
            url: '/Blogs/Update',
            type: "POST",
            data: JSON.stringify(blog),
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function (d) {
                if(d.success == true)
                    jQuery('#status').html('Blog saved');
                else
                    jQuery('#status').html('The server had some issues with the data');
            },

            error: function () {
                jQuery('#status').html('Ajax error occurred during the transmission.');

            }
        });

如您所见,success函数需要一个对象而不是一个方法,因此前一个响应中的代码会产生语法错误。上面的请求可以成功通过ajax但仍然在服务器上生成错误。 ajax中的错误功能仅在传输过程中生成错误时出现,或者在服务器上生成错误时出现。

服务器应该处理上述请求的方式如下(asp.net MVC 2或3):

    [Transaction]
    [HttpPost]
    public ActionResult Update(Blog blog)
    {
        if (ModelState.IsValid && blog.IsValid())
        {
            this.blogRepository.SaveOrUpdate(blog);
            return Json(new { success = true });

        }

        return Json(new { success = false });

    }

谢谢,

番茄

答案 3 :(得分:0)

对我来说,这听起来像字符串中的字符是问题,尝试传递一个包含以下字符的简单字符串

{[,:"']}

我认为这也会失败,只是删除字符直到它通过