繁体   English   中英

将参数作为字典传递 <string,string[]> 与jQuery的getJSON方法

[英]Passing parameter as Dictionary<string,string[]> with jquery getJSON method

我试图使用$.getJSON函数传递多个参数。 为此,我创建了一个DTO类,其定义如下。

public class MyDTO
{
    public string IncludeProperties {get; set;}
    public Dictionary<string,string[]> Predicate {get; set;}
}

这是我的网络API功能:

[HttpGet]
[Route("FindAll")]
public IEnumerable <Hotel> FindAll([FromUri] MyDTO predicateDTO) {
  return DataStore.FindAll <Hotel> (predicateDTO.IncludeProperties, PredicateHelper.ConvertStringToLambda <Hotel> (predicateDTO.Predicate));
}

var uri = '/api/Hotel/FindAll';
var predicate = {
  "HotelName": ["HOtel", "==", ""],
  "PaymentStatus": ["True", "==", "AND"]
}
var data = {
  IncludeProperties: ["HotelDetails", "HotelDetails.HotelMainPhotos"],
  Predicate: predicate
}
busyIndicatorVisibility(true);
$('#ModalOtel .modal-body').find(".media").remove();
$.getJSON(uri, {
    predicateDTO: data
  }).done( //TODO something)

当我调用函数IncludeProperties有项目,但Predicate属性为null 如何传递Dictionary<string,string[]>作为参数?

我将尝试向您展示一个从解决方案入手的想法。

您将需要像这样更新您的MyDTO模型:

    public class Predicate
    {
        public string[] HotelName { get; set; } // In javascript can hold: ["HOtel", "==", ""] 
        public string[] PaymentStatus { get; set; }
    }
    public class MyDTO
    {
        public string[] IncludeProperties { get; set; }
        public Predicate predicate { get; set; }
    }

在您的jQuery函数中,您需要将$ .getJSON替换为$ .ajax(),如下所示:

var predicate = {
    "HotelName": ["HOtel", "==", ""],
    "PaymentStatus": ["True", "==", "AND"]
};
var data = {
    IncludeProperties: ["HotelDetails", "HotelDetails.HotelMainPhotos"],
    Predicate: predicate
};

$.ajax(
{
    url: uri,
    type: "POST",
    data: JSON.stringify(data), // To convert javascript objects in json strings.
    dataType: "json",
    contentType: "application/json; charset=utf-8", // To send json objects to the web api controller.
    beforeSend: function ()
    {
        console.log("Wait a minute...");
    },
    success: function (response)
    {
        console.log(response);
    }
});

$ .ajax()函数将使用以下格式发送您的json数据:

{
    "IncludeProperties": [
        "HotelDetails",
        "HotelDetails.HotelMainPhotos"
    ],
    "Predicate": {
        "HotelName": [
            "HOtel",
            "==",
            ""
        ],
        "PaymentStatus": [
            "True",
            "==",
            "AND"
        ]
    }
}

在您的Web API控制器中,尝试更改为:

public string FindAll(MyDTO predicateDTO) // This contains all model with submodels.
{
     string result = "";
     // You can have access to predicateDTO instance with the current data;
     // predicateDTO.predicate.HotelName...
     return result;
}

我希望这可以帮助你。

我改变了方法。

 [HttpGet]
 [Route("FindAll")]
 public IEnumerable<Hotel> FindAll(string[] IncludeProperties, string Predicate)
 {
    Dictionary<string,string[]> predicateAsDictionary = JsonConvert.DeserializeObject<Dictionary<string, string[]>>(predicateString)
    return DataStore.FindAll<Hotel>(IncludeProperties, predicateAsDictionary);
 }

getJson方法不会将定义的var predicate对象转换为Dictionary但是当我使用JSON.stringify(predicate)发送此对象时,可以将该字符串反序列化为Dictionary

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM