2009-09-22 94 views
2

運行jQuery腳本我有一個負載執行jQuery腳本的ASP.net MVC頁。 該腳本在控制器上調用一個動作並保存下拉列表。頁面不負載

這個工程我的開發計算機上,但在部署到Web服務器(贏2K3機器上運行IIS 6)在頁面加載,但它不運行造成空下拉列表中的腳本。

我在腳本文件夾中的jQuery的1.3.2.js文件,我已經添加了映射ASPNET_ISAPI.DLL在web服務器上。還有什麼我失蹤?

這是頁面的一部分,可以保護在我的機器上工作的下拉列表,但不在其部署的web服務器上,因爲您可以看到該腳本調用ApplicationSettings控制器以獲取JSON對象,以保護下拉列表

<asp:Content ID="MainContent" ContentPlaceHolderID="MainContent" runat="server"> 
    <script src="~/Scripts/jquery-1.3.2.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     // Wait for the document to be ready 
     $(document).ready(function() 
     { 
      var selectedApp = $('#selectedApplication').val(); 
      var selectedMac = $('#selectedMachine').val(); 

      // Get the list of applications and populate the applications drop down list 
      $.getJSON("/ApplicationSettings/Applications/List", function(data) 
      { 
       var items = "<option>----------- Select Application to Configure ----------</option>"; 
       $.each(data, function(i, application) 
       { 
        var selected = (application.Value == selectedApp) ? 'selected' : ''; 
        items += "<option value='" + application.Value + "'" + selected + ">" + application.Text + "</option>"; 
       }); 
       $("#Applications").html(items); 
      }); 

      // Get the list of machines where the selected application is installed and populate the machines drop down list 
      $("#Applications").change(function() 
      { 
       if ($("#Applications").attr("value") != "") 
       { 
        // Enable the Machines DDL if a valid application is selected 
        $("#Machines").removeAttr("disabled"); 

        // Populate the machines DDL with a list of machines where the selected application is installed 
        $.getJSON("/ApplicationSettings/Machines/List/" + $("#Applications > option:selected").attr("value"), function(data) 
        { 
         // Set the first item in the list 
         var items = "<option>---------- Select Machine -----------</option>"; 

         // Retrieve the list of machines for th selected application from the database 
         $.each(data, function(i, machine) 
         { 
          var selected = (machine.Value == selectedMac) ? 'selected' : ''; 
          items += "<option value='" + machine.Value + "'" + selected + ">" + machine.Text + "</option>"; 
         }); 

         // Add the items retrieved to the Machines DDL 
         $("#Machines").html(items); 

         if ($("#Machines").attr("value") != "") 
         { 
          $("#btnSearch").removeAttr("disabled"); 
         } 
         else 
         { 
          $("#btnSearch").attr("disabled", "disabled"); 
         } 
        }); 
       } 
       else 
       { 
        // If a valid application has not been selected then disable the Machines DDL 
        $("#Machines").attr("disabled", "disabled"); 
        $("#btnSearch").attr("disabled", "disabled"); 
       } 
      }); 

      if (selectedApp != "") 
      { 
       $("#Machines").removeAttr("disabled"); 

       $.getJSON("/ApplicationSettings/Machines/List/" + selectedApp, function(data) 
       { 
        var items = "<option>---------- Select Machine -----------</option>"; 
        $.each(data, function(i, machine) 
        { 
         var selected = (machine.Value == selectedMac) ? 'selected' : ''; 
         items += "<option value='" + machine.Value + "'" + selected + ">" + machine.Text + "</option>"; 
        }); 
        $("#Machines").html(items); 
       }); 

       if (selectedMac != "") 
       { 
        $("#btnSearch").removeAttr("disabled"); 
       } 
       else 
       { 
        $("#btnSearch").attr("disabled", "disabled"); 
       } 
      } 
      else 
      { 
       $("#Machines").attr("disabled", "disabled"); 
       $("#btnSearch").attr("disabled", "disabled"); 
      } 
     }); 


     function saveSelectedApplication() 
     { 
      $("#selectedApplication").val(""); 
      $("#selectedMachine").val(""); 
      $("#selectedApplication").val($("#Applications").attr("value")); 
      if ($("#Applications").attr("value") != "") 
      { 
       $("#Machines").removeAttr("disabled"); 
       if ($("#Machines").attr("value") != "") 
       { 
        $("#btnSearch").removeAttr("disabled"); 
       } 
       else 
       { 
        $("#btnSearch").attr("disabled", "disabled"); 
       } 
      } 
      else 
      { 
       $("#Machines").attr("disabled", "disabled"); 
       $("#btnSearch").attr("disabled", "disabled"); 
      } 
     } 

     function saveSelectedMachine() 
     { 
      $("#selectedMachine").val(""); 
      $("#selectedMachine").val($("#Machines").attr("value")); 
      if ($("#Machines").attr("value") != "") 
      { 
       $("#btnSearch").removeAttr("disabled"); 
      } 
      else 
      { 
       $("#btnSearch").attr("disabled", "disabled"); 
      } 
     } 
    </script> 
+0

您的腳本是否在運行?腳本頂部的簡單提醒? – littlechris 2009-09-22 19:58:09

+0

你在你的global.asax文件中使用任何自定義路由嗎?您在下面留下的評論與我在實施如下之前得到的錯誤是一樣的。我相信由於我的腳本路徑問題,JS運行得太早。 – littlechris 2009-09-22 20:24:41

+0

劇本是有定位的作用在該行 $ .getJSON( 「/的applicationSettings /應用/列表」 中輸入功能(數據) 一個問題,如果我將其更改爲\t \t \t $ .getJSON(」 ../的applicationSettings /應用程序/列表「,功能(數據) 它的工作原理 我想我真的需要做的是能夠正確地解決行動的路徑不知道如何做到這一點在jquery 任何想法? – user99513 2009-09-22 20:58:50

回答

5

我有劇本尋路的問題。我用這個擴展方法對它進行排序。

public static class HtmlHelperExtensions 
    { 
     /// <summary> 
     /// Scripts the specified HTML to allow for correct pathing of the resource. 
     /// </summary> 
     /// <param name="html">The HTML.</param> 
     /// <param name="path">The path.</param> 
     /// <returns></returns> 
     public static string Script(this HtmlHelper html, string path) 
     { 
      var filePath = VirtualPathUtility.ToAbsolute(path); 
      return "<script type=\"text/javascript\" src=\"" + filePath + "\"></script>"; 
     } 
    } 

然後把這個母版頁:

<%@ Import Namespace="MYNAMESPACE.Helpers" %> 

,然後僅僅指剛登記像所有的腳本:

<%=Html.Script("~/Scripts/jquery-1.3.2.min.js")%> 

嘗試implemeting的follwoing助手以及:

public static string AbsolutePath(this HtmlHelper html, string path) 
{ 
    return VirtualPathUtility.ToAbsolute(path); 
} 

然後改變你的c全部爲

$.getJSON("<%=Html.AbsolutePath("~/ApplicationSettings/Machines/List/")%>" 

當您的視圖呈現時,絕對路徑應由MVC ViewEngine插入。

+0

+1尼斯簡單的例子。 – CmdrTallen 2009-09-22 19:54:29

+0

littlechris這個作品!非常感謝你的幫助。並解釋瞭解決方案。 我做了細微的變化,即增加了「〜/」來獲得的getJSON方法工作 \t \t $ .getJSON(「<%= Html.AbsolutePath(」〜/ ApplicationSettings/Machines/List /「)%>」 – user99513 2009-09-23 13:23:11

0

你把你的代碼放在「$(document).ready(function(){[YOUR_CODE]});」塊?如果不是,DOM可能還沒有準備好;)

+0

正如你所看到的,我確實有一個$(document).ready(....)塊內的函數。 我走到直通腳本使用提供IE8的腳本調試工具,它拋出一個錯誤說「對象應爲」在該行 $(文件)。就緒(函數().. 任何想法? – user99513 2009-09-22 20:11:52

+0

這可能是一個腳本路徑問題就像littlechris指出的那樣,看起來像$沒有被定義(這是唯一可能在這一點上未定義的東西)在附註中,我強烈建議使用firefox + firebug進行正確的調試(IE8的是一個悲傷的玩笑)。 – 2009-09-22 21:06:51

0

你是如何編碼的動作?如果您在服務器上的虛擬目錄中運行,這可能很重要。如果你作爲http://localhost:xxxx/controller/action在本地運行,但由於遠程運行http://mysever/myapp/controller/action,那麼你需要確保你使用Url.Action()解決的行動結果的真實路徑。