我似乎无法发布一系列对象

时间:2014-11-12 22:44:08

标签: javascript jquery ajax cordova asp.net-web-api

好的,所以我在这里。

我有一些代码可以向.NET WebAPI(c#)发送一系列好东西。

var questions = [];
$('#questions').find('input').each(function(){
    var text = $(this).val();
    questions.push({ ID: 123, Question: text });
});

$.ajax({
    type: 'POST',
    url: _apiPath + '/main/savequestions',
    data: { "" : questions }
}).done(function(data){
    alert(JSON.stringify(data));
});

所以我在一段时间之前了解到.NET Web API与数组混淆,并且存在一个已知的错误,这就是为什么你必须用""作为财产名称。

这是我的web api控制器:

  [Route("main/savequestions")]
  [HttpPost]
  public List<Question> SaveQuestions(List<Question> questions)
  {
    using (var mc = new MyContext())
        {
            List<Question> list = new List<Question>();

            if (questions != null)
            {
                foreach (var item in questions)
                {
                       var dbQ = new Question();
                       dbQ.ID = Guid.NewGuid();
                       dbQ.ToolID = item.ID;
                       dbQ.Question = item.Question;
                       mc.Questions.Add(dbQ);

                       list.Add(dbQ);
                }
            }

            mc.SaveChanges();

            return list;
        }   
 }

当我们在桌面上时这很好用。一切都节省......工作......太棒了。

因此我们使用PhoneGap,当我们使用phonegap应用程序模拟运行此应用程序的应用程序时,不会保存任何数据。我们检查并确保我们发送的JSON是相同的...但是当我们运行它时,控制器似乎得到一个空数组,因此它不会保存任何东西。

这种不一致足以让我感到沮丧。

帮助!

大卫

1 个答案:

答案 0 :(得分:1)

尝试以下方法:

  1. 在您的jQuery AJAX调用JSON上专门设置“contentType”。 jQuery提交为'application / x-www-form-urlencoded; charset =默认为UTF-8'。
  2. JSON.stringify您的数组
  3. 这将告诉WebAPI在模型绑定期间使用JSON MediaTypeFormatter: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

    我不确定为什么桌面浏览器或移动浏览器之间存在差异,除非桌面浏览器或jQuery以不同方式处理“数据”。

    $.ajax({
        type: 'POST',
        url: _apiPath + '/main/savequestions',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(questions)
    }).done(function(data){
        alert(JSON.stringify(data));
    });