不使用模型和Ajax发送POST Json请求

4

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

由于JSON实际上是JSON对象的列表,每个对象都有不同的字段和长度,因此很难为我创建一个输入模型。

所以我想知道是否有一种方法可以在ASP.NET MVC2中无需模型/ ajax发布JSON到控制器?

2个回答

3

在 @Brian 的答案基础上,我们已经完成了这个任务。请记住,这是Jquery 1.4.2版本。

这部分内容可以拆分并简化,但它使用回调而不是完整的发布。最初它用于实时过滤结果并将它们的第一页重新加载到同一区域。

首先,在页面上有一个按钮/链接/其他元素。这将调用JavaScript来构建JSON数据。

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

接下来,我们有doStuff()函数。在这种情况下,refinements是一个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")%>
<% } %>

所以,点击此按钮会调用回调函数到服务器。以下是我们在控制器中的操作。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将其流回。
希望对你有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接