c# - JavaScript 未在 C# MVC4 中触发

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

我的 View 中有以下代码:

    <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);" />

在我的 Controller 中我有:

[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 中运行它时,它工作得很好。 当我将它部署到服务器时,我收到了出错的消息。 在我的日志记录中,没有点击按钮的痕迹。

最佳答案

根据您的评论,部署后您的应用会安装在 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 View 中生成 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

希望对您有所帮助!

关于c# - JavaScript 未在 C# MVC4 中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21596803/

相关文章:

c# - 如何使用C#4.0从xml内容中删除特定的xml元素?

c# - 免费安装程序是否可以轻松地将应用程序安装为 Windows 服务?

c# - EF代码中的一个实体多个表首先正确的表名

javascript - 如何将每个 div 背景设置为其内部 HTML

c# - 将 viewbag 从 Action Controller 传递到局部 View

c# - 访问数据库时应用程序崩溃

javascript - html,标签形式类似于StackOverflow的一种

asp.net-mvc-4 - 如何将我自己的数据库与 Simple Membership 和 Web Security 一起使用?什么是 MVC 4 安全性?

jquery - 当用户在搜索中键入内容时创建下拉菜单?

javascript - 根据样式更新数字