POST Json没有模型和Ajax

时间:2010-11-23 13:39:07

标签: c# asp.net jquery json asp.net-mvc-2

目前,我只想使用HTTP POST将json发送到asp.net mvc2控制器。

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

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

2 个答案:

答案 0 :(得分:3)

在@ Brian的答案的基础上,我们完成了这个。请记住这是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();
    }

接下来,我们有一个带有隐藏字段的ajax表单,doStuff()将我们的数据放入其中。这也可能是一种常规的旧形式。

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

因此,在此按钮上调用click,这会导致回调到服务器。这是我们在控制器中的动作。 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 :(得分:1)

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

HTH。