传了很多参数(ajax,asp.net)
Pass a lot of parameters (ajax, asp.net)
我想通过 ajax 函数传递一些参数。我能够传递字符串列表或 2 个参数(int 类型)。我在传递列表和 int 参数时遇到问题。最终,可能会有比两个更多的参数。
我的例子:
.cs 文件:
public string AddListElement(int secId, List<string> fieldsList)
{
//code...
return "a";
}
.cshtml 文件:
<script>
function AddElement(idSection) {
var stringArray = new Array();
stringArray[0] = "item1";
stringArray[1] = "item2";
stringArray[2] = "item3";
$.ajax({
type: "POST",
url: "/BK/User/AddListElement",
data: {
secId: idSection,
fieldsList: stringArray,
},
dataType: "json",
traditional: true,
}).fail(function () {
//code...
}).done(function (data) {
//code...
});
}
</script>
//other code...
<div class="form-group main-center2 col-8 mt-2">
<a class="btn btn-success btn btn-block" onclick="AddElement(@Model.Section[i].Id);" href="#">
Dodaj
</a>
</div>
在这种情况下,idSec 顺利通过,但列表为空。通过在 Url 和这样的列表中传递 idSec,我能够很好地传递它。但在我看来,这不是最好的解决方案,特别是如果我想要更多参数,例如2 个列表和 3 个 int 参数。
如何像这样传递多个参数?假设参数不同:int、string、list。
我阅读了类似的主题,但对我没有任何帮助。
PS.
从body接收JSON内容的最好方法是根据JSON的属性定义一个模型,像你的情况,你可以这样定义:
public class ReceiveData
{
public int secId { get; set; }
public List <string > fieldsList { get; set; }
}
控制器:
public string AddListElement(ReceiveData data)
{
//code...
return "a";
}
但是如果你不想定义额外的模型,你可以使用一个Dictionary<string, object>
来保存你想要从POST接收的所有数据:
public string AddListElement(Dictionary<string, object> keyValuePairs)
{
//code...
return "a";
}
每个动作只能从主体绑定一个参数
控制器方法将单个参数映射到请求 body;您可以使用 [FromBody]
(参数属性)来指定哪一个 (see here):
When a parameter has [FromBody], Web API uses the Content-Type header to select a formatter. In this example, the content type is "application/json" and the request body is a raw JSON string (not a JSON object).
At most one parameter is allowed to read from the message body. So this will not work:
// Caution: Will not work!
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }
在您的情况下,创建一个模拟您发送的 JSON object 的 DTO:
class ListElementDto {
public int SecId { get; set; }
public List<string> FieldsList { get; set; }
}
public string AddListElement([FromBody] ListElementDto model)
{
//code...
return "a";
}
Side-note: 你会想把你请求中的 Content-Type
header 设置为 "application/json"
,我也在你的 data
上推荐 运行 JSON.stringify
。 Ajax dataType
用于告诉 ajax 服务器响应的预期内容。
我想通过 ajax 函数传递一些参数。我能够传递字符串列表或 2 个参数(int 类型)。我在传递列表和 int 参数时遇到问题。最终,可能会有比两个更多的参数。
我的例子:
.cs 文件:
public string AddListElement(int secId, List<string> fieldsList)
{
//code...
return "a";
}
.cshtml 文件:
<script>
function AddElement(idSection) {
var stringArray = new Array();
stringArray[0] = "item1";
stringArray[1] = "item2";
stringArray[2] = "item3";
$.ajax({
type: "POST",
url: "/BK/User/AddListElement",
data: {
secId: idSection,
fieldsList: stringArray,
},
dataType: "json",
traditional: true,
}).fail(function () {
//code...
}).done(function (data) {
//code...
});
}
</script>
//other code...
<div class="form-group main-center2 col-8 mt-2">
<a class="btn btn-success btn btn-block" onclick="AddElement(@Model.Section[i].Id);" href="#">
Dodaj
</a>
</div>
在这种情况下,idSec 顺利通过,但列表为空。通过在 Url 和这样的列表中传递 idSec,我能够很好地传递它。但在我看来,这不是最好的解决方案,特别是如果我想要更多参数,例如2 个列表和 3 个 int 参数。
如何像这样传递多个参数?假设参数不同:int、string、list。 我阅读了类似的主题,但对我没有任何帮助。
PS.
从body接收JSON内容的最好方法是根据JSON的属性定义一个模型,像你的情况,你可以这样定义:
public class ReceiveData
{
public int secId { get; set; }
public List <string > fieldsList { get; set; }
}
控制器:
public string AddListElement(ReceiveData data)
{
//code...
return "a";
}
但是如果你不想定义额外的模型,你可以使用一个Dictionary<string, object>
来保存你想要从POST接收的所有数据:
public string AddListElement(Dictionary<string, object> keyValuePairs)
{
//code...
return "a";
}
每个动作只能从主体绑定一个参数
控制器方法将单个参数映射到请求 body;您可以使用 [FromBody]
(参数属性)来指定哪一个 (see here):
When a parameter has [FromBody], Web API uses the Content-Type header to select a formatter. In this example, the content type is "application/json" and the request body is a raw JSON string (not a JSON object).
At most one parameter is allowed to read from the message body. So this will not work:
// Caution: Will not work! public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }
在您的情况下,创建一个模拟您发送的 JSON object 的 DTO:
class ListElementDto {
public int SecId { get; set; }
public List<string> FieldsList { get; set; }
}
public string AddListElement([FromBody] ListElementDto model)
{
//code...
return "a";
}
Side-note: 你会想把你请求中的 Content-Type
header 设置为 "application/json"
,我也在你的 data
上推荐 运行 JSON.stringify
。 Ajax dataType
用于告诉 ajax 服务器响应的预期内容。