【发布时间】:2018-04-06 16:18:15
【问题描述】:
我当前的 mvc 项目有问题。
我正在使用 ajax 调用将新的 cmets 发送到服务器,但该方法甚至没有被调用。
我的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");
}
这与我在后端控制器中的操作方式完全相同,但它运行良好。
我希望有人能帮助我..
更新:
进行一些更改只是为了尝试其他方法是否有效。
Change1 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 get 中的“actionUrl”变量已更改为 /threads/answer,但我总是收到 500 内部服务器错误。当我在方法中放置一个断点时,它不会在 ajax 调用的任何点停止。
【问题讨论】:
-
这些参数是希望发布在 URL 中还是请求正文中?
-
我想从 ajax 调用的“数据”属性中接收它们。不知道那是附在标题还是正文上的东西。我考虑过尝试添加“[FromBody]”,但是当我查看后端控制器的其他(工作)方法时,没有 [FromBody] 语句
-
脚本执行时是否存在
#answer_button?这是一个单独的.js文件还是已写入视图。 -
您的
msg变量是一个字符串,作为 url 变量可能会导致问题。我建议将其包装在 JSON 中并发布数据,而不是使用 url 变量,除非您知道不会遇到字符转义问题。 -
您的代码应该可以工作。但最好不要通过 queruystring 发送数据。如果用户键入一条长消息怎么办。使用请求正文(数据)发送数据。检查您的浏览器开发工具->控制台/网络选项卡,看看是否有任何 js 错误 / 调用已完成或收到 200 OK 响应
标签: javascript c# ajax asp.net-mvc