通过ajax调用传递给mvc控制器时,在列表中获取空值

时间:2015-07-02 05:49:19

标签: javascript ajax asp.net-mvc asp.net-mvc-4

我将我的列表传递给mvc控制器,但是我在控制器中获取空值。但是当我在客户端显示警告时,我的列表中有值。

ajax call

$("#addTiles").click(function() {
    userTiles = JSON.stringify({
        'userTiles': userTiles
    });
    alert("Entered function.");
    alert(userTiles[0].TileID);
    var url = '@Url.Action("AddTiles")';
    $.ajax({
        type: "GET",
        url: url,
        data: userTiles,
        success: function(d) {
            if (d.indexOf('"IsSessionExpired":true') != -1) {
                location.reload();
            } else {
                onAddTilesSuccessful(d);
            }
        },
        error: function() {
            errorInOperation();
        },
        contentType: "application/html; charset=utf-8",
        dataType: 'html'
    });
});

function onAddTilesSuccessful(e) {
    $("#tilesSubmissionMsg").append(e);
}

function errorInOperation(d) {
    $("#tilesSubmissionMsg").append("Something went wrong");
}

mvc控制器

  public ActionResult AddTiles(List<UserTilesVM> userTiles)
    {
        return View();
    }

列表模型

public class UserTilesVM
{
    public int TileID { get; set; }
    public int TopPosition { get; set; }
    public int LeftPosition { get; set; }
}

在javascript中列出

"{"userTiles":[{"TileID":"3","TopPosition":0,"LeftPosition":0}]}"

我也尝试过用stringfy发送我的列表,但这也没有用。

5 个答案:

答案 0 :(得分:5)

您的AJAX设置中有两次contentType和dataType,具有不同的值,这将打破AJAX调用。

请记住,contentType是告诉服务器期望的数据类型,dataType用于确定从documentation返回的数据类型。

编辑:我看到你编辑了代码!

在这种情况下,由于您使用JSON.Stringify来修改要发送的数据,因此您将使用contentType: "application/json; charset=utf-8",作为contentType,因为您要将JSON数据发送到后端。

答案 1 :(得分:5)

在方法[HttpGet]上使用AddTiles,因为您在Ajax匹配时使用了type: "GET"

[HttpGet]
public ActionResult AddTiles(List<UserTilesVM> userTiles)
{
     return View();
}

如果仍然无法正常工作,请尝试使用type: "POST"关于Ajax点击和方法使用[HttpPost]

[HttpPost]
public ActionResult AddTiles(List<UserTilesVM> userTiles)
{
    return View();
}

答案 2 :(得分:2)

当我们尝试使用ajax传递对象数据时,我们必须将数据存储在变量中并使用&#34;数据直接传递数据:&#39;变量&#39;&#34;在AJAX到控制器方法

#if __IPHONE_OS_VERSION_SOFT_MAX_REQUIRED < __IPHONE_8_4
#undef __AVAILABILITY_INTERNAL__IPHONE_8_4
#define __AVAILABILITY_INTERNAL__IPHONE_8_4 __NBU_AVAILABILITY_STARTING("8.4")
#define __NBU_APICHECK_8_4(_ios)            __NBU_AVAILABILITY_STARTING("8.4")
#else
#define __NBU_APICHECK_8_4(_ios)            CF_AVAILABLE_IOS(_ios)
#endif

//使用[HttpPost]关键字获取AJAX传递的值。

$("#addTiles").click(function() {
   var userTiles = ({
        'userTiles': userTiles
    });
    alert("Entered function.");
    alert(userTiles[0].TileID);
    var url = '@Url.Action("AddTiles")';
    $.ajax({
        type: "POST",
        url: url,
        data: userTiles,
        success: function(d) {
            if (d.indexOf('"IsSessionExpired":true') != -1) {
                location.reload();
            } else {
                onAddTilesSuccessful(d);
            }
        },
        error: function() {
            errorInOperation();
        },
        contentType: "application/html; charset=utf-8",
        dataType: 'html'
    });
});

function onAddTilesSuccessful(e) {
    $("#tilesSubmissionMsg").append(e);
}

function errorInOperation(d) {
    $("#tilesSubmissionMsg").append("Something went wrong");
}

答案 3 :(得分:1)

我认为你的清单定义不合适:

"{"userTiles":[{"TileID":"3","TopPosition":0,"LeftPosition":0}]}"

应该是:

"{"userTiles":[{"TileID":"3","TopPosition":"0","LeftPosition":"0"}]}"

答案 4 :(得分:1)

我使用的这个序列工作正常

你已经检查了   contentType:&#34; application / json&#34;,   dataType:&#34; json&#34;, ajax方法中的序列