使用jquery将简单的json发布到MVC动作控制器方法

时间:2014-04-10 13:41:20

标签: jquery asp.net-mvc json asp.net-mvc-4

我只是想将一个简单的对象传递给MVC控制器方法,而不必为它创建一个视图模型。尽管id被调用,但控制器方法中的参数始终为null。我的jquery帖子如下。

 $(function () {
    $("button[id$='addidentifier']").click(function (evt) {
        alert('button click');
        evt.preventDefault();
        var postdata = {
            identifier: $('#Identifier').val(),
            goldkey: $('#Goldkey').val()
        };
        $.ajax({
            type: 'POST',
            url: 'altbloomberg/AddIdentifier',
            data: JSON.stringify({ postdata :  postdata }) ,
            success: function(data) {
                 alert('data: ' + data);
            },
            failure: function(a,b,c) {
                alert(a);
            },
            //contentType: "application/json",
            dataType: 'json'//,
            //processData: false
        });
    });

控制器方法很简单,我甚至没有完成它的主体因为我想先将数据传入。

    [System.Web.Http.HttpPost]
    public ActionResult AddIdentifier(string postdata)
    {
           // put here to place a breakpoint to look at postdata
           string lookhere = "";
    }

我看过其他帖子,这就是他们“似乎”表示要做的事情。这似乎应该很容易。那么我在这里做错了什么?

根据以下一些建议:我更改了jquery函数以传递

         $.ajax({
            type: 'POST',
            url: 'altbloomberg/AddIdentifier',
            contentType: "application/json",
            dataType: 'json',
            data: JSON.stringify(postdata),
            success: function(data) {
                 alert('data: ' + data);
            },
            failure: function(a,b,c) {
                alert(a);
            }
        });

我刚刚更改了stringify方法params并设置了内容类型,然后将控制器参数更改为

    (string identifier, string goldkey).  

这适用于stringify方法的结果

   "{"identifier":"XS0939678792","goldkey":"LAW"}"

那么为什么我只是在控制器方法中使用一个参数

   (String postdata) 

并使用

   JSON.Stringify({postdata:postdata}) 

其结果是

  "{"postdata":{"identifier":"XS0939678792","goldkey":"GOVT"}}" does it NOT work. 

控制器方法不应该匹配postdata json值吗?

2 个答案:

答案 0 :(得分:3)

我认为您必须创建一个简单的模型来接收数据。

例如,这是您的行动:

[System.Web.Http.HttpPost]
public ActionResult AddIdentifier(PostDataModel postdata)
{

}

其中PostDataModel是具有此结构的简单模型:

class PostDataModel {
     public string Identifier {get;set;}
     public string GoldKey {get;set;}
}

您必须在ajax请求中启用此行:

contentType: "application/json",

答案 1 :(得分:2)

AddIdentifier操作的参数应该是具有'identifier'和'goldkey'属性的模型,或者是每个属性的字符串参数。

像这样:

[System.Web.Http.HttpPost]
public ActionResult AddIdentifier(Identifier model)

或者这个:

[System.Web.Http.HttpPost]
public ActionResult AddIdentifier(string identifier, string goldkey)

如果您真的想要字符串化数据,那么您可以将dataType:'json'输出,它只会发送字符串。

修改

根据您的评论,您似乎想要更具动感的内容。您可以将postdata参数的类型从字符串更改为动态。我不确定这是否可以开箱即用。如果不是,您可以创建自己的自定义模型绑定器以将数据绑定到动态参数。

http://www.codeproject.com/Articles/605595/ASP-NET-MVC-Custom-Model-Binder

如果我是你,我会坚持创建模型或定义参数的前两个选项之一。