我正在向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
}
在谷歌浏览器中,我可以看到请求有效负载
如何在家庭控制器操作中访问数据?
答案 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());
我希望它能帮助别人。