2014-02-06 49 views
2

我已經在我看來,下面的代碼:的JavaScript在C#MVC4不點火

<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中運行它時,它工作得很好。 當我將它部署到服務器時,我收到錯誤信息。 在我的日誌記錄中沒有被點擊的按鈕的軌跡。

+0

確保所有腳本都正確地包含在生產服務器上。除此之外,你會得到什麼錯誤信息? – Robert

+0

我沒有收到任何消息。我得到的唯一信息是「'出錯了,請查看日誌以獲取更多信息。」但是我的日誌裏沒有任何東西。甚至沒有點擊按鈕的痕跡。 –

+0

當我查看我的頁面源時,腳本就在那裏。所以這應該沒問題。 –

回答

1

根據您的評論,部署時,您的應用安裝在accindigoapps.blabla.lok/jobmonitor

但是,您的腳本的硬編碼爲url: '/job/CancelJob'。這將意味着:

  • 當你從VS腳本會工作,因爲該請求被髮送到一個URL像http://localhost:XXX/job/CancelJob
  • 然而
  • 在生產調試,請求將被髮送到http://accindigoapps.blabla.lok/job/CancelJob,缺少jobmonitor部分。

您需要一種方式來通知您的JS代碼,有關應用程序的基本網址:

  • 你可以在Razor視圖使用Url.Action("CancelJob","job")生成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', 
        ... 
    

如果您更喜歡生成完整的網址,你可以按照類似的方法。看看this question

希望它有幫助!

+0

我用的是這樣的 - 網址:「@ Url.Action(」 YourView「‘YourController’)」 – Sergey

+0

@Sergey這就是我所提到的選項之一:)。它需要您在剃鬚刀中生成JS代碼所需的url,並將該url傳遞給您的JS代碼。另一個選項允許在全局JS對象中生成基礎URL,並在構建URL時將其用於腳本。你可以使用任何你最適合的套裝! (例如,如果您的視圖中沒有腳本標記,則會更喜歡第二個) –