3

我正在向POSTasp.net mvc 项目中的 Home 控制器发送一个 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

        }

在 Google Chrome 中,我可以看到请求负载 在此处输入图像描述

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

4

3 回答 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 中的设置格式相匹配。您可能还需要根据您的特定要求调整视图模型中使用的数据类型。

于 2013-09-18T21:36:00.447 回答
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();
    }
于 2013-09-19T05:27:49.290 回答
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 inGlobal.asax.cs'

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

于 2013-09-19T14:35:45.053 回答