如何在 .net mvc 中的控制器方法上获取 ajax post 数据

How to get ajax post data on controller method in .net mvc

我正在使用 jquery 将一些数据 post 发送到控制器的方法。我可以像下面那样成功 post。

POST http://localhost:16161/VisualObjectPairing/SaveParameters HTTP/1.1

Host: localhost:16161

Connection: keep-alive

Content-Length: 146

Accept: application/json, text/javascript, */*; q=0.01

Origin: http://localhost:16161

X-Requested-With: XMLHttpRequest

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36

Content-Type: application/json

Referer: http://localhost:16161/VisualObjectPairing/Index

Accept-Encoding: gzip, deflate

Accept-Language: en-US;en;q=0.8,en-US;q=0.6,en;q=0.4

数据

{"deviceId":"9",
 "SwitchStatus":"6/0/1",
 "InOperation":"6/0/2",
 "selectedInteractiveObjectSet":["5557","5558","5559","5560","5561","5562","5563"]}

但是数据上的字段像 SwichStatusInOperation 是动态添加的表单,可以有更多的具有不同类型的名称。所以基本上我不能把它们作为参数放在控制器方法上。

控制器方法是

public JsonResult SaveKnxDeviceParameters(int deviceId, List<int> selectedInteractiveObjectSet = null)
{


}

参数deviceIdselectedInteractiveObjectSet自动绑定。非常好。但是我想从请求(或我能得到的任何东西)对象中手动获取 SwitchStatusInOperation 值,但我找不到任何 属性 这给了我他们的价值观。 Request.Form 是空的,所以我不能像 Request.Form["InOperation"].

那样使用它

我应该从哪里获得这些值?

它们自动按名称绑定。所以你需要在编译时知道这些名称或者将它们作为键值对集合传递

{ "deviceId": 9,
  "parameters": [ {"key": "SwictchStatus", "value": "6/0/1" },
                  {"key":"InOperation", "value": "6/0/2" }],  
  "selectedInteractiveObjectSet": [] }

现在 "key" 和 "value" 是静态名称。

这是一个强类型模型示例:

public class UploadModel
{
    public int deviceId { get; set; }
    public int[] selectedInteractiveObjectSet { get; set; }
    public Parameter[] parameters { get; set; }
}

public class Parameter
{
    public string key { get; set; }
    public string value { get; set; }
}

public JsonResult SaveKnxDeviceParameters(UploadModel model)
{
    foreach(var item in model.parameters)
    {
        var key = item.key;
        var value = item.value;
    }
    ...
}

为了将附加变量传递给控制器​​(动态添加),您可以在服务器端使用附加参数 Dictionary<string, object> dynamicVariablesDictionary<string, string> dynamicVariables。在这种情况下,您需要将所有动态变量包装在 JS 中的单个对象中,并将其传递给控制器​​操作中的适当参数。例如


JS代码

var deviceId = getDeviceId();
var selectedInteractiveObjectSet = getSelectedInteractiveObjectSet();
var dynamicVariables = getDynamicVariables(); // assume function returns object like { "SwitchStatus":"6/0/1", "InOperation":"6/0/2"}
$.ajax({
        type: 'POST',
        url: '/VisualObjectPairing/SaveKnxDeviceParameters',
        data: {
               deviceId: deviceId,
               selectedInteractiveObjectSet: selectedInteractiveObjectSet,
               dynamicVariables: dynamicVariables
              },
       dataType: 'json',
       success: function(data) { ... }
});

控制器的动作

public JsonResult SaveKnxDeviceParameters(int deviceId, List<int> selectedInteractiveObjectSet = null, Dictionary<string, string> dynamicVariables)
{


}