在C# ASP.NET AJAX POST请求中读取请求负载数据

3

我正在向ASP.NET MVC项目中的Home控制器发送一个POST Ajax请求。以下是示例JavaScript代码(convertUtcToLocal基本上是一个将时间转换为本地日期的函数)。

var data = [{"Time":convertUtcToLocal(1377003600000),"OldValue":35.2,"NewValue":""},
{"Time":convertUtcToLocal(1377003600000),"OldValue":35.2,"NewValue":""},    
{"Time":convertUtcToLocal(1377003600000),"OldValue":35.2,"NewValue":""},    
{"Time":convertUtcToLocal(1377003600000),"OldValue":35.2,"NewValue":""},    
{"Time":convertUtcToLocal(1377003600000),"OldValue":35.2,"NewValue":""},    
{"Time":convertUtcToLocal(1377003600000),"OldValue":35.2,"NewValue":""},    
{"Time":convertUtcToLocal(1377003600000),"OldValue":35.2,"NewValue":""},    
{"Time":convertUtcToLocal(1377003600000),"OldValue":35.2,"NewValue":""},    
{"Time":convertUtcToLocal(1377003600000),"OldValue":35.2,"NewValue":""}];

$.ajax({url : 'http://localhost:64387/Home/TableEdit', 
        type : 'POST', 
        contentType:'application/json',
        dataType :'json', 
        data : JSON.stringify(data)});

在Home控制器中,我获取到了:
[HttpPost]
        public object TableEdit(object data)
        {
            // object is shown in the Watch as object

        }

在谷歌浏览器中,我可以看到请求负载。如何访问我的Home控制器操作中的数据?
3个回答

1
我应该如何访问Home控制器操作中的数据? 当然,通过编写视图模型:
public class MyViewModel
{
    public DateTime Time { get; set; }
    public decimal OldValue { get; set; }
    public decimal? NewValue { get; set; }
    public string Action { get; set; }
}

然后,在您的控制器操作中使用此视图模型的集合作为参数:

[HttpPost]
public ActionResult TableEdit(IList<MyViewModel> data)
{
    ... do something with the view model here
}

顺便提一下,要注意DateTime字段的格式。确保应用程序当前的区域设置格式与JSON中的格式匹配。根据您的具体要求,您还可能需要调整视图模型中使用的数据类型。

0

这就是我解决问题的方法。使用 Newtonsoft.Json.Linq

以下是自定义模型绑定器和控制器。

   public class TableEditCustomBinder : IModelBinder
        {
            public object BindModel(ControllerContext controllerContext,
                            ModelBindingContext bindingContext)
            {
                var incomingData = bindingContext.ValueProvider.GetValue("data").AttemptedValue;
                JObject root = JObject.Parse("{\"root\": " + incomingData + "}");
                JArray items = (JArray)root["root"];
                JObject item;
                JToken jtoken;
                List<TableData> data = new List<TableData>();
                string action="" , newValue="", oldValue="", dataType;
                double time=0;
                for (int i = 0; i < items.Count; i++)
                {
                    item = (JObject)items[i];
                    jtoken = item.First;
                    while (jtoken != null)//loop through columns
                    {
                        dataType = ((JProperty)jtoken).Name.ToString().ToLower();

                        switch (dataType)
                        {
                            case "time":
                                time = Convert.ToDouble(((JProperty)jtoken).Value);
                                break;
                            case "newvalue":
                                newValue = ((JProperty)jtoken).Value.ToString();
                                break;
                            case "oldvalue":
                                oldValue = ((JProperty)jtoken).Value.ToString();
                                break;
                            case "action":
                                action = ((JProperty)jtoken).Value.ToString();
                                break;
                            default:
                                break;
                        }
                         jtoken = jtoken.Next;
                    }
                    if (time != 0) {
                        data.Add(new TableData(time, oldValue));
                        data[data.Count-1].NewValue = newValue;
                        data[data.Count-1].Action = action;
                    }

                }

                return data;

            }
        }
        [HttpPost]
        public object TableEdit(string server, string tag, [ModelBinder(typeof(TableEditCustomBinder))] List<TableData> data)      
        {         
            //Use data the way you want
        }

ajax 请求。我正在将时间作为 UTC 字符串传递。但在代码中可以以其他方式处理。

$.ajax({url: 'http://localhost:64387/Home/TableEdit', type : 'POST', 
        contentType:"application/x-www-form-urlencoded",
        dataType :'json', 
        data : { server: "server", tag : "xyz", data : JSON.stringify(data)}});

还有别忘了把这段代码放在Global.asax.cs文件中的Application_Start()方法里。

ModelBinders.Binders.Add(typeof(List<TableData>), new HomeController.TableEditCustomBinder()); 希望能对其他人有所帮助。


0
基本上,您正在传递一个JSON字符串,因此控制器中的action方法将接受一个字符串,您可以使用Newtonsoft.Json将其转换为model
传递JSON数据:
$.ajax({
                url: '/Home/TableEdit',
                type: 'POST',
                data: { "modelData": result }
            });

以及控制器操作方法为

   [HttpPost]
    public ActionResult TableEdit(string modelData)
    {
        List<ViewModel> listOfModel = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Model>>(modelData);
        return View();
    }

模型数据字符串的长度是否有字符限制?我只是想确认一下,以防我发送大量数据时破坏代码。 - lostpacket
JSON请求本身没有继承大小限制。[对于Asp.Net]如果您从服务器返回json,则可以为其设置MaxLength。 - 111

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