将对象从Javascript传递给MVC控制器

时间:2015-06-26 12:51:28

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

我尝试过其他人的许多不同的解决方案,但两者都没有运气,我似乎无法调试javascript。

这些是一些变量,因此您可以看到类型。所有变量都包含数据

我的观点如下:

    var startTime = new Date();
    var images = @Html.Raw(Json.Encode(ViewBag.Images));
    var sound = @Html.Raw(Json.Encode(ViewBag.Tones));
    var gamePlayed = @Html.Raw(Json.Encode(ViewBag.GamePlayedId));


function SaveGameData()
    {
        $.ajax({
            type: 'POST',
            url: '@Url.Action("Play", "Game")',
            dataType: 'json',
            contentType: "application/json; charset=utf-8",
            data: {
                GamePlayedId: gamePlayed,
                Level: level,
                ExpectedImageName: expectedImageArray,
                ExpectedToneName: expectedToneArray,
                SelectedImageName: selectedImageArray,
                SelectedToneName:selectedToneArray,
                StartTime: startTimeArray,
                EndTime: endTimeArray
            },
            success: function () {
                alert('suc');
            },
            error: function (args) {
                alert('error');
            }
        });
    }

我的控制器如下:

    [Authorize]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Play(SaveGameViewModel model)
    {
        // Do something
        return Json(new { success = true , message ="successful"});
    }

我的观看模型如下:

public class SaveGameViewModel
{
    public int GamePlayedId { get; set; }
    public int Level { get; set; }
    public List<string> ExpectedImageName { get; set; }
    public List<string> ExpectedToneName { get; set; }
    public List<string> SelectedImageName { get; set; }
    public List<string> SelectedToneName { get; set; }
    public List<DateTime> StartTime { get; set; }
    public List<DateTime?> EndTime { get; set; }
}

我一直收到来自ajax警报的错误消息。我尝试过很多不同的东西,似乎没什么用。我感谢您提供的任何帮助。非常感谢!

1 个答案:

答案 0 :(得分:2)

您所显示的代码至少有2个问题。

首先,您的方法标有[ValidateAntiForgeryToken]属性,但您没有传递令牌,因此永远不会运行该方法。删除该属性,或使用该属性(假设您的表单包含@Html.AntiForgeryToken()

data: { 
    __RequestVerificationToken: $('[name=__RequestVerificationToken]').val(),      
    .... // your other properties
},

其次,您发布了一个javascript对象,因此您需要删除contentType: "application/json; charset=utf-8",选项(或者您需要使用JSON.stringify()字符串化数据

旁注:您不清楚为什么要手动构建要发送到控制器的对象。如果您的表单控件基于SaveGameViewModel并且使用强类型的html帮助程序正确生成,那么您可以使用

将其全部发回
$.ajax({
    data: $('form').serialize(),
    ....
});