1

我有一个二维字符串数组(12x5),我想将它从 javascript 函数传递到 asp.net mvc 控制器操作。在 IE 中使用开发人员工具,我知道该数组填充了我想要的内容,因此问题出在 post 函数中或周围。

var dateArray = new Array();
//Populate Data

$.post("/Event/SetDateCalculationParameters", { dates: dateArray }, function () {
    //Stuff
});
}

这是 MVC 控制器动作

public ActionResult SetDateCalculationParameters(string[][] dates)
    {
        //Do stuff

        return Json(true);
    }

在控制器动作中,日期数组中有 12 项,但它们都是空的。我已经在这里待了几个小时,我很难过。有没有更简单的方法来做到这一点?还是我错过了什么?

4

2 回答 2

4

您可以将它们作为 JSON 请求发送:

var dateArray = new Array();
dateArray[0] = [ 'foo', 'bar' ];
dateArray[1] = [ 'baz', 'bazinga' ];
// ... and so on

$.ajax({
    url: '@Url.Action("SetDateCalculationParameters", "Event")',
    type: 'POST',
    contentType: 'application/json',
    data: JSON.stringify({ dates: dateArray }),
    success: function (result) {

    }
});

动作签名必须如下所示:

[HttpPost]
public ActionResult SetDateCalculationParameters(string[][] dates)
于 2012-07-26T06:22:58.547 回答
2

为了解决同样的问题,我创建了应该应用于参数的 JsonModelBinder 和 JsonModelAttribute:

public class JsonModelBinder : IModelBinder
    {
        private readonly static JavaScriptSerializer _serializer = new JavaScriptSerializer();

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var stringified = controllerContext.HttpContext.Request[bindingContext.ModelName];

       if (string.IsNullOrEmpty(stringified))
            return null;

        return _serializer.Deserialize(stringified, bindingContext.ModelType);
    }
}

public class FromJsonAttribute : CustomModelBinderAttribute
{
    public override IModelBinder GetBinder()
    {
        return new JsonModelBinder();
    }
}

您的控制器将如下所示:

public ActionResult SetDateCalculationParameters([FromJson]string[][] dates)

您还应该对数组进行字符串化:

$.post("/Event/SetDateCalculationParameters", { dates: JSON.stringify(dateArray)}, function () {             //Stuff         });         }

这个对我有用。

于 2012-07-26T13:01:16.313 回答