![](/img/trans.png)
[英]JQuery JSON POST request to ASP.NET MVC controller does not hit end-point, but manual use of route works correctly
[英]ASP.NET MVC POST Route does not point to the correct Method
我当前的 mvc 项目有问题。
我正在使用 ajax 调用向服务器发送新评论,但该方法甚至没有被调用。
我的js代码:
$("#answer_button").click(function () {
showLoadingTab();
var actionUrl = '@Url.Action("AnswerThread", "Threads")';
var threadId = $("#threadId").val();
var msg = $("#answer_msg").val();
alert(actionUrl);
alert(msg);
alert(threadId);
$.ajax({
url: actionUrl,
type: "POST",
data: "Message=" + msg + "&threadId=" + threadId,
success: function (msg) {
hideLoadingTab();
location.reload();
},
error: function () {
alert("Ein Fehler ist aufgetreten.");
hideLoadingTab();
}
});
});
正如你看到的,我已经提醒了 url、msg 和 threadId,它们都是正确的。 url: "/Threads/AnswerThread", msg: "test", threadId: 1。
我已经尝试在 AnswerThread 方法中放置一个断点,但它没有被调用。 “AnswerThread”方法位于“ThreadsController”中,如下所示:
[HttpPost]
public ActionResult AnswerThread(string Message, int threadId)
{
var userId = User.Identity.GetUserId();
using (var db = new UnitOfWork(new BlogContext()))
{
db.Posts.Add(new Post()
{
Message = Message,
PublishTime = DateTime.Now,
ThreadId = threadId,
UserId = userId
});
db.Complete();
}
return PartialView("/Views/Partial/Clear.cshtml");
}
这与我在后端控制器中所做的完全相同,但在那里它运行良好。
我希望有人可以帮助我..
更新:
进行了一些更改只是为了尝试是否有任何其他方式有效。
更改 1 js:
var data = {
threadId: threadId,
Message: msg
};
$.ajax({
url: actionUrl,
type: "POST",
content: "application/json; charset=utf-8",
dataType: "json",
data: data,
success: function (msg) {
if (msg.success == true) {
hideLoadingTab();
location.reload();
}
else
{
alert("Ein Fehler ist aufgetreten: " + msg.error);
}
},
error: function () {
alert("Ein Fehler ist aufgetreten.");
hideLoadingTab();
}
});
更改 2 c#:
[HttpPost]
public JsonResult AnswerThread([System.Web.Http.FromBody]PostDataModel data)
{
var userId = User.Identity.GetUserId();
string error = "";
bool success = false;
try
{
using (var db = new UnitOfWork(new BlogContext()))
{
db.Posts.Add(new Post()
{
Message = data.Message,
PublishTime = DateTime.Now,
ThreadId = data.threadId,
UserId = userId
});
success = true;
db.Complete();
}
}
catch(Exception ex)
{
error = ex.Message;
}
return Json(String.Format("'Success':'{0}', 'Error':'{1}'", success, error));
我现在尝试使用和不使用“[FromBody]”语句。 哦,是的,我已经添加了这样的 DataModel:
public class PostDataModel
{
public int threadId { get; set; }
public string Message { get; set; }
}
我还尝试手动配置指向的路线。
routes.MapRoute(
name: "AnswerThread",
url: "threads/answer",
defaults: new { controller = "Threads", action = "AnswerThread" }
);
js 中的“actionUrl”变量已更改为 /threads/answer 但我总是收到 500 内部服务器错误。 当我在方法中放置断点时,它不会在 ajax 调用的任何一点停止。
在“网络”选项卡的 Chrome 开发工具中,它告诉我有一个名为“id”的参数,该参数为空,导致此 500 内部服务器错误。 我试图找出有关此的更多信息,但错误并未告诉我此参数的位置。
我在此方法或数据模型中没有名为“id”的参数,那么它来自哪里?
解决方案:
我的路线映射很糟糕。 我首先映射路线 /threads/{id} 然后做了 /threads/answer 所以当 /threads/answer 被调用时,它认为“answer”是一个 id,所以它试图进入“Index”方法。 所以对于我的特定问题(也许对于其他一些有同样问题的人),解决方案只是将 /threads/answer 路由的映射放在 /threads/{id} 路由的前面并且它起作用了。
请检查您的参数类型,在控制器threadId 中是 int类型,并且从 ajax 调用中您正在传递字符串类型。
在 Js
$("#answer_button").click(function () {
showLoadingTab();
var actionUrl = '@Url.Action("AnswerThread", "Home")';
var threadId = parseInt($("#threadId").val());
var msg = "Answer message";
alert(threadId);
$.ajax({
url: actionUrl,
type: "POST",
data: { Message: msg, threadId: threadId },
success: function (msg) {
hideLoadingTab();
location.reload();
},
error: function () {
alert("Ein Fehler ist aufgetreten.");
hideLoadingTab();
}
});
});
在控制器中
[HttpPost]
public ActionResult AnswerThread(string Message, int threadId)
{
return Json("Data");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.