【问题标题】:JQuery Ajax and ASP.NET MVC3 causing null parametersJQuery Ajax 和 ASP.NET MVC3 导致空参数
【发布时间】:2015-02-02 15:18:11
【问题描述】:

这个问题已经被问过很多次了,但我找到的解决方案似乎都没有奏效。让我觉得这可能是一个新问题,并且可能是 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");
    }
});

没有工作。如果我只有一个传递给控制器​​的字符串,那就可以了。但是一旦我引入一个对象,我就无法让它工作。

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

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

【问题讨论】:

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


    【解决方案1】:

    您的代码看起来不错,应该可以工作。我刚刚在一个新应用程序中测试了以下内容,没有问题。

    型号:

    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>
    

    【讨论】:

    • 看了你的回答让我意识到我的 AddressInfo 对象的所有集合都是私有的。改变它解决了这个问题。不幸的是,我没有收到有关此问题的任何错误/指示。在我花费大部分时间的 WCF 世界中,私有集还可以,但我想在 MVC 中情况并非如此。非常感谢!
    【解决方案2】:

    您好,您需要一个 ValueProvider。

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

    这个 ValueProvider 使用默认的 JavaScriptSerializer 获取发布的 Json 并填充 Action 方法参数

    ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
    

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

    【讨论】:

    • 我不知道为什么,但是在我把它放进去之前,绑定对我不起作用。
    • 也许您没有使用 ASP.NET MVC 3?
    【解决方案3】:

    感谢您的上述回复,但示例并不完全正确。客户端代码如下所示:

            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 中的错误函数仅在产生错误时出现,无论是在传输过程中,还是在服务器端出现 500。

    服务器处理上述请求的方式如下所示(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 });
    
        }
    

    谢谢,

    番茄

    【讨论】:

      【解决方案4】:

      在我看来,问题在于字符串中的字符,尝试传递一个包含以下字符的简单字符串

      {[,:"']}
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多