在c#asp.net ajax POST请求中读取请求有效负载

时间:2013-09-18 21:18:10

标签: c# asp.net ajax asp.net-mvc post

我正在向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)});

在家庭控制器中我得到了,

[HttpPost]
        public object TableEdit(object data)
        {
            // object is shown in the Watch as object

        }

在谷歌浏览器中,我可以看到请求有效负载 enter image description here

如何在家庭控制器操作中访问数据?

3 个答案:

答案 0 :(得分:1)

  

如何在家庭控制器操作中访问数据?

通过编写视图模型当然:

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中的格式匹配。您还可能需要根据具体要求调整视图模型中使用的数据类型。

答案 1 :(得分:0)

基本上,您正在传递JSON字符串,因此控制器中的action method将接受一个字符串,您可以使用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();
    }

答案 2 :(得分: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)}});

另外不要忘记将其放在Application_Start()' method in Global.asax.cs'

ModelBinders.Binders.Add(typeof(List<TableData>), new HomeController.TableEditCustomBinder()); 我希望它能帮助别人。