我有一个适用于测试应用的简单帖子
控制器代码
public ActionResult Delete(string Id)
{
... delete record ...
}
的JavaScript
function delAnnouncement(id) {
$.ajax({
type: "POST",
url: "@Url.Action("Delete", "Announcements")",
contentType: "application/json; charset=utf-8",
data: JSON.stringify({ "Id": "03d23684-098a-4ae8-8fa2-7d9ce70d63ef" }), // Hard coded for testing
success: function (data) {
$("#AnnouncementsPH").replaceWith(data);
}
});
}
我创建了一个简单的测试应用程序,它可以在那里工作。
我正在寻找关于现有应用程序中可能存在的任何想法,这些想法总是会导致传递的id为null。
我尝试过的事情:
两个应用程序之间的路径信息相同
它们都是安全的https网站
现有网站上的其他表格按预期工作。这是使用带参数的javascript帖子的唯一地方。这只是列出任何系统公告的新视图
据我所知,HTML是有效的。
提琴手显示数据正在发送
我试图简单地在Id
传递硬编码。
我不知道是什么导致 Post
无法正常工作。
感谢您的任何建议
编辑1:这是fiddler Raw帖子
POST https://localhost:44300/Announcements/Delete HTTP/1.1
Host: localhost:44300
Connection: keep-alive
Content-Length: 39
Accept: */*
Origin: https://localhost:44300
X-Requested-With: XMLHttpRequest
Content-TypeOfNotification: application/json; charset=utf-8
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36
Content-Type: text/plain;charset=UTF-8
Referer: https://localhost:44300/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: jetbrains.charisma.main.security.PRINCIPAL=NmI4YmFhZTExMThjZDZkZjNmZTBhMDNiZWM4NmY3MDYzZWNiMWE3M2ZmZDM5ODMwYjViMjczN2ZkZmU3YmZlZTpyb290; TCSESSIONID=233EBE63123BA35468235F441F54D7E4; ASP.NET_SessionId=ycnx1ejeyahzipwduux2quqz; __RequestVerificationToken=FnOKGFfBZKEBX4E0KBoV9133e5KK3h9Pd_OjDzNPjv7ifMTMk5uHUPmT621hOQFyOCwW5IhdewKLPDMs2_9jY2vVwrHLYOU9f0F86mN-NoQ1; .AspNet.ApplicationCookie=V8ZnbAx_2_H1Wx946VLcQ235XplzC-uvKdw4CP7Sm8ZVnJu9pG63EuzC0ptOZZNBvzZkRjB0RJS25Pn1WHOzeQSrqoWl87keqRDS6_vMwZ9L6PgKU0rJz7OhD7eKps8l3tzR097zI5WbU_chUZFKLLw1c__rfN3Fy6BbHC1qNtgx0C86AShhG5EsNiruYqJZn-Uj7Z2h75YcZctCFniMyuzD-9RetcMjkN3_PbAJg-_urfntG9NwsMEQdBf1b3K9H3GP_wUYRhnbQdNZpuAkAEa6bVfJiHrnKFhnhLkP8BAfocbMKES1wQKbXBfcNn62cEKUu3On3lHNCNN4zEvOhxF1aDaBk-yghOtvtNkROeFTKMQFD0U-XXAf-RKm0Nwgp1Tb2Ip2U42vshDRNGXQSkOojisVUxiPmkrxDtckNycQd0br1cFSqxfeXyg3cg_vKUP1VMBQcBQxZO6MVLSCDdcpANyoE43IoLp3BHgURJZP88vF18JfVV646XGOZ3QU
Id=03d23684-098a-4ae8-8fa2-7d9ce70d63ef
正如您所见,Id已发布到控制器,只是未解析并提供给方法中的参数。
答案 0 :(得分:3)
您可以附加如下参数:
var targeturl = '@Url.Action("Test", "Controller")?id=' + ID;
$.ajax({
url: targeturl,
type: "GET",
success: function(data) { },
error: function (data) { }
});
或者您可以直接使用jQuery ajax数据参数:
$.ajax({
type: "POST",
url: '@Url.Action("Test", "Controller")',
data: { id: "your-id" }
})
.done(function( msg ) {
alert( "Data Saved: " + msg );
});
答案 1 :(得分:1)
我认为您不必使用JSON.stringify
来获取数据。默认情况下,他们将获得的值将使用ajax作为Jason发送。
试试这个
data : { Id: "03d23684-098a-4ae8-8fa2-7d9ce70d63ef" }
答案 2 :(得分:1)
我没有在其他任何地方找到这个答案所以我必须通过实验来发现它。
你会发现在你的控制器中,它正在接收一个Request.Form对象,如果你查看Request.Form [0],你会找到你的数据。表单中存在数据但MVC将其视为空的原因是表单元素被POST的键是“”(空白)。
所以客户端,你必须正确设置内容类型,并在数据之前加上“myData =”+ JSON.stringify(myJSONObject),其中“myData”是你要添加的关键名称,如这样:
$.ajax({
type: "POST",
url: URL,
data: "myData="+JSON.stringify(myJSONObject),
contentType: "application/x-www-form-urlencoded; charset=utf-8"
在服务器端,你的[HttpPost]端点必须有一个变量,其中同名是你在AJAX中声明的密钥,如下所示:
`
[HttpPost]
[Authorize]
public ActionResult Index (string myData) // <-- var name matches AJAX
{
// de-serialize data into server-side object using
// JSONConvert.DeserializeObject
}
`
答案 3 :(得分:0)
没有一个答案对我有用,所以我成功地解决了:
带有JQuery的JavaScript:
function sendAjaxPostRequest(url, id, value) {
$.post(url+'?id='+id+'&value='+value,
function (returnedData) {
console.log(returnedData);
});
}
C#ASP.NET:
// POST api/<controller>
public void Post(int id, string value)
{
Console.WriteLine($"{id}: {value}");
}
Post
参数列表签名必须与POST请求网址匹配,例如?id=123
表示必须有方法Post(int id)
。希望这对某人有帮助。
在责怪您的前端JS之前,请确保使用Postman 测试您的后端!
奇怪的是,JS的$.ajax({ ... });
本身并不能工作,但是如果我同时使用和 jQuery的$.post(...);
和$.ajax({...})
POST请求,那么它们都可以工作-非常奇怪。