2010-11-23 69 views
4

现在,我只想使用HTTP POST将json发送到asp.net mvc2控制器。POST Json无模型和Ajax

由于JSON实际上是JSON对象的列表,并且它们每个都有不同的字段长度,所以我很难组成输入模型。

所以我想知道有没有办法让我将JSON发布到模型/ ajax到ASP.NET MVC2中的控制器?

回答

3

建立在@布赖恩的答案,我们已经完成了这一点。请记住,这是JQuery 1.4.2

这是有点突出,可以简化,但它是使用回调,而不是完整的职位。它最初用于实时过滤结果,并将其第一页重新加载到同一区域。

首先,我们在页面上有按钮/链接/任何东西。这将会调用javascript来构建json数据。

<input type="button" alt="Update" onclick="doStuff();" /> 

然后,我们有doStuff()函数。在这种情况下,优化是json对象的集合。

function doStuff() { 

     var refinements = GetRefinementSelections(); 
     var profileId = '<%= Model.Profile.ProfileId %>'; 

     var startDate = $('#SearchbyDateFrom').val(); 
     var endDate = $('#SearchbyDateTo').val(); 

     var jsonData = JSON.stringify(
      { 
       "ProfileId" : profileId, 
       "RefinementGroups": refinements, 
       "StartDate": startDate, 
       "EndDate": endDate 
      }); 

      $('#jsonData').val(jsonData); 
      $('#update-button').click(); 
    } 

接下来,我们必须与doStuff里面的隐藏字段(),把我们的数据转换成Ajax表单。这也可能是一种常规的旧形式。

<% using (Ajax.BeginForm("MyAction", "MyController", new { }, 
     new AjaxOptions { }, 
     new { id = "filteredResultsForm" })) 
    { %> 
    <input type="submit" id="update-button" style="display:none;" /> 
    <%= Html.Hidden("jsonData")%> 
<% } %> 

因此,点击被调用这个按钮,这导致回调到服务器。这是我们在控制器中的操作。 JsonSerializer是Newtonsoft.Json

public ActionResult MyAction(string jsonData) 
    { 
     JsonSerializer serializer = new JsonSerializer(); 

     StringReader sr = new StringReader(jsonData); 
     Newtonsoft.Json.JsonTextReader reader = new JsonTextReader(sr); 

     JsonRequest jsonRequest = (JsonRequest)serializer.Deserialize(reader, typeof(JsonRequest)); 

     //do work with object 

     return View(); 
    } 

JsonRequest需要一个类的对象,并且所有属性,子类和它们的属性,等等等等需要被序列这种方法工作的一部分。尽管有一组流数据被返回(作为json对象的集合),但实际上并没有看到数据是什么样的,我相当肯定你可以设计某种类结构来支持你的数据。

1

您可以将JSON存储在隐藏字段中,然后使用实用程序将JSON转换为控制器中的对象。它必须位于表单的发布数据中才能使用;存储在隐藏字段是一种方法,或使用AJAX将其流式传回。

HTH。