angularjs - 使用 DotNetNuke DnnApiController 我无法使用 $http.post 命令检索发布数据,但 .ajax 有效
问题描述
使用角度,我正在尝试使用 $http.post 将一些帖子数据发送到 DnnApiController:
findit: function(onSuccess, onFailure,searchTerms) {
alert(JSON.stringify(searchTerms));
const rvtoken = $("input[name='__RequestVerificationToken']").val();
$http({
cache: false,
dataType: 'json',
url: "/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearch",
method: "Post",
headers: {
"ModuleId": moduleId,
"TabId": tabId,
"RequestVerificationToken": rvtoken
},
data: { "": JSON.stringify(searchTerms) }
}).success(onSuccess).error(onFailure);
----.ajax方法----
findit: function(onSuccess, onFailure,searchTerms) {
alert(JSON.stringify(searchTerms));
const rvtoken = $("input[name='__RequestVerificationToken']").val();
$.ajax({
cache: false,
dataType: 'json',
url: "/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearch",
method: "Post",
headers: {
"ModuleId": moduleId,
"TabId": tabId,
"RequestVerificationToken": rvtoken
},
data: { "": JSON.stringify(searchTerms) }
}).success(onSuccess).error(onFailure);
更新 2018/09/02 我试过这个:
$http.post("/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearch3",
searchTerms,
{
headers: {
"ModuleId": moduleId,
"TabId": tabId,
"RequestVerificationToken": rvtoken
}
}).success(onSuccess).error(onFailure);
这是我调用的 DnnApiController 方法:
[AllowAnonymous]
[DotNetNuke.Web.Api.ValidateAntiForgeryToken]
public string DoAdvancedSearch([FromBody] string advancedSearchItems)
{
IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
return JsonConvert.SerializeObject(SearchTerms);
}
或者
public string DoAdvancedSearch2([FromBody] IList<SearchTerm> SearchTerms)
{
//IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
return JsonConvert.SerializeObject(SearchTerms);
}
或者
[HttpPost]
[AllowAnonymous]
[DotNetNuke.Web.Api.ValidateAntiForgeryToken]
[Route("doadvancedsearch3")]
public string DoAdvancedSearch3(IList<SearchTerm> SearchTerms)
{
//IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
return JsonConvert.SerializeObject(SearchTerms);
}
所有的 api 都是从 $http.post 命令触发的,具体取决于我调用的 api。但是 $http.post 方法会导致 api 的参数 (advancedSearchItems) 为空,而 .ajax 方法在所有情况下都可以正常工作 我在 $http 方法中缺少什么?
解决方案
我不确定这是否有资格作为答案,但它正在工作:
$http(
{
url: "/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearchANG",
data: JSON.stringify(searchTerms),
method: "post",
headers: {
"ModuleId": moduleId,
"TabId": tabId,
"RequestVerificationToken": rvtoken,
'Content-Type': 'application/json'
}
}).success(onSuccess).error(onFailure);
或者
$http.post("/DesktopModules/AdvancedProductSearchAPI/API/AdvancedProductSearchApi/DoAdvancedSearchANG",
JSON.stringify(searchTerms),
{
headers: {
"ModuleId": moduleId,
"TabId": tabId,
"RequestVerificationToken": rvtoken,
"Content-Type': 'application/json"
}
}).success(onSuccess).error(onFailure);
接口:
//this method works with AJAX
[HttpPost]
[AllowAnonymous]
[DotNetNuke.Web.Api.ValidateAntiForgeryToken]
public string DoAdvancedSearchAJAX([FromBody] string advancedSearchItems)
{
IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
return JsonConvert.SerializeObject(SearchTerms);
}
//This method works with AngularJS $http.post method
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public string DoAdvancedSearchANG(IList<SearchTerm> SearchTerms)
{
//IList<SearchTerm> SearchTerms = JsonConvert.DeserializeObject<List<SearchTerm>>(advancedSearchItems);
return JsonConvert.SerializeObject(SearchTerms);
}
我认为我尝试的所有事情(例如AngularJs $http.post() 不发送数据)都是针对旧版本的 Angular 的,我让它变得比它需要的更复杂。
推荐阅读
- webpack - Webpack:位于不同目录中的多个入口点,具有模拟输出
- javascript - 如何通过 Cloud Functions (Javascript) (Node.js) 找到我的设备令牌
- r - 数据框 %in% 数据框。(R 编程)
- python - 使用 Beautiful Soup 从 XML 返回嵌套属性
- jpa - 使用 Quarkus 和 Redis 的 JPA L2-Cache
- typescript - 相同更高种类类型的打字稿联合与更高种类的联合
- javascript - TS2769:如何使用 TypeScript 中 setTimeout 的返回值修复“clearTimeout”?
- machine-learning - 我们可以使用任何 ML 算法自动标记数据集吗?
- c# - 我正在尝试使用 JsonConvert.DeserializeObject 将字符串转换为 json
- excel - 我可以在选定范围内随机化行(而不是列)中的单元格吗?