【问题标题】:ASP.NET MVC POST Route does not point to the correct MethodASP.NET MVC POST Route 未指向正确的方法
【发布时间】: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


【解决方案1】:

在“网络”选项卡的 Chrome 开发工具中,它告诉我有一个名为“id”的参数,该参数为空,导致此 500 内部服务器错误。我试图找出有关此的更多信息,但错误并没有告诉我此参数的位置。
我在此方法或数据模型中没有名为“id”的参数,那么它来自哪里?

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

【讨论】:

    【解决方案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");
        }
    

    【讨论】:

    • 我反其道而行之,将 C# 中的“ThreadId”设置为字符串并将其转换为 int 但不起作用。
    • 如果您需要从 ajax 调用发送字符串,那么它必须是控制器中的 strtng 参数。请更改为字符串而不是“int threadId”
    • “threadId”是一个整数,所以我不必更改它。正如你所说,我改为“parseInt”(查看问题中的更新),但这并没有改变任何东西。
    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2011-01-04
    • 2014-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多