【问题标题】:JavaScript not firing in C# MVC4JavaScript 未在 C# MVC4 中触发
【发布时间】:2014-03-03 00:55:03
【问题描述】:

我认为有以下代码:

    <script type="text/javascript">
    function OnCancelClick(e)
    {
        var jobId = e;
        var flag = confirm('You are about to cancel job : ' + jobId + '. Are you sure you want to cancel this job?');
        if (flag) {
            $.ajax({
                url: '/job/CancelJob',
                type: 'POST',
                data: { jobId: jobId },
                dataType: 'html',
                success: function (result) { alert('Job ' + jobId + ' was cancelled.'); document.location = "@Url.Action("Index", "Job")"; },
                error: function () { alert('Something went wrong. Check the log for more information.'); }
        });
    }
    return false;
    }
</script>

在我看来我也有:

<input type="submit" id="cancelButton" value="Cancel" onclick="javascript: return OnCancelClick(@Model.Id);" />

在我的控制器中,我有:

[HttpPost]
        public ActionResult CancelJob(int jobId)
        {
            try
            {
                logger.LogInfo(string.Format("<start> Cancel-button clicked for job : {0}", jobId), jobId);

                JobCommandService.ChangeStatus(jobId, 6);

                logger.LogInfo(string.Format("<end> Cancel-button clicked for job : {0}", jobId), jobId);

                return RedirectToAction("Index", "Job");
            }
            catch (Exception ex)
            {
                logger.LogError(ex.Message, ex, jobId);
                Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                return Json(new { Success = false, Message = ex.Message });
            }
        }

当我在我的 VS2012 中运行它时,它工作得很好。 当我将它部署到服务器时,我收到了出错的消息。 在我的日志中,没有任何按钮被点击的痕迹。

【问题讨论】:

  • 确保您的所有脚本都正确包含在生产服务器上。除此之外,您会收到什么错误消息?
  • 我没有收到任何消息。我得到的唯一消息是“'出了点问题。查看日志以获取更多信息。”但是我的日志中没有任何内容。甚至没有被点击的按钮的痕迹。
  • 当我查看页面的源代码时,脚本就在其中。所以应该没问题。
  • 您在 Firefox/Chrome 的网络选项卡中看到了什么?可能是使用//myserver/myapp/ 之类的root url 部署的站点以及发送到//myserver/job/CancelJob 的ajax 帖子吗?
  • error: function() 更改为error: function(x,t,e) 并检查x.responseText

标签: c# javascript asp.net-mvc-4 visual-studio-2012


【解决方案1】:

根据您的评论,部署时您的应用安装在accindigoapps.blabla.lok/jobmonitor

但是,您的脚本将 url 硬编码为 url: '/job/CancelJob'。这意味着:

  • 当您从 VS 调试时,您的脚本将工作,因为请求被发送到像 http://localhost:XXX/job/CancelJob 这样的 URL
  • 但是在生产中,请求将被发送到 http://accindigoapps.blabla.lok/job/CancelJob,缺少 jobmonitor 部分。

您需要一种方法来告知您的 JS 代码您的应用程序的基本 url:

  • 您可以使用 Url.Action("CancelJob","job") 在 Razor 视图中生成 Url,并将该 Url 传递到您的 javascript 代码中。

  • 另一种选择是在基本布局的一些 javascript 中使用 Url.Content("~/")。该助手 Url.Content("~/") 将仅返回您的应用程序文件夹,/ 在您的开发环境中,/jobmonitor/ 在部署时。这样,您的应用程序根相对 url 将可用于任何脚本,因此您可以使用它来构建根相对 url,就像您在脚本中所做的那样:

    <script>
        var myApp = {};
        myApp.BaseUrl = '@Url.Content("~/")';
    </script>
    
    //Some other script like yours would be able to keep using root-relative urls as: 
    $.ajax({
        url: myApp.BaseUrl + 'job/CancelJob',
        ...
    

如果您更喜欢生成完整的 url,您可以采用类似的方法。看看this question

希望对你有帮助!

【讨论】:

  • 我使用这样的东西 - url: "@Url.Action("YourView", "YourController")"
  • @Sergey 这是我提到的选项之一:)。它要求您在 razor 中生成 JS 代码所需的 url,并将该 url 传递给您的 JS 代码。另一个选项允许在全局 JS 对象中生成基本 url,并在构建 url 时在脚本上使用它。您可以使用最适合您的任何东西! (例如,如果您的视图中没有脚本标签,您会更喜欢第二个)
猜你喜欢
  • 1970-01-01
  • 2020-10-23
  • 2017-12-19
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多