【问题标题】:Read request payload in c# asp.net ajax POST request在 c# asp.net ajax POST 请求中读取请求有效负载
【发布时间】:2013-09-23 19:41:00
【问题描述】:

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

        }

在 Google Chrome 中,我可以看到请求负载

如何访问 Home 控制器操作中的数据?

【问题讨论】:

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


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

    【讨论】:

      【解决方案2】:

      这就是我解决问题的方法。使用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 inGlobal.asax.cs'

      ModelBinders.Binders.Add(typeof(List&lt;TableData&gt;), new HomeController.TableEditCustomBinder()); 我希望它可以帮助其他人。

      【讨论】:

        【解决方案3】:

        基本上,您传递的是 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();
            }
        

        【讨论】:

        • modelData 字符串的长度是否有字符限制?我只是想确保在发送大数据的情况下,我不会破坏代码。
        • JSON 请求本身没有继承大小限制。 [For Asp.Net]如果你从服务器返回json,你可以为它设置MaxLength。
        猜你喜欢
        • 2014-09-23
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 2018-04-23
        • 2015-09-04
        • 1970-01-01
        • 2021-02-12
        相关资源
        最近更新 更多