ASP.NET MVC POST Route未指向正确的方法

时间:2017-10-25 14:11:44

标签: javascript c# ajax asp.net-mvc

我的当前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");
    }

这与我在后端控制器中完成的方式完全相同,但它的工作正常 我希望有人可以帮助我..

更新:
做一些改变只是为了尝试,如果任何其他方式的工作。
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调用的任何一点停止。

2 个答案:

答案 0 :(得分:0)

在“网络”标签的Chrome开发工具中,它告诉我有一个名为“id”的参数为null,导致此500内部服务器错误。我试图找到关于此的更多信息,但错误并没有告诉我这个参数的位置。
我在这个方法或数据模型中没有名为“id”的参数,所以它来自哪里?

解决方案
我的路线映射很糟糕。我首先映射了route / threads / {id}和THEN do / threads / answer所以当调用/ threads / answer时,它认为“answer”是一个id,所以它试图进入“Index”方法。因此,对于我的特定问题(也许对于其他一些有相同问题的人),解决方案只是将/ threads / answer路由的映射放在/ threads / {id}路由之前并且它可以工作。

答案 1 :(得分:-2)

请检查您的参数类型,在控制器 threadId是int 类型,并从ajax调用中传递 string 类型。

在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");
    }