2012-12-14 37 views
0

我正在使用umbraco 4.我想遍歷節點並將其urlname存儲在數組中。因此,該數組看起來像... ['aaa-node','bbb-node','ccc-node']。但是,下面的代碼是不工作...循環通過節點和在umbraco剃鬚刀陣列中存儲值

<script type="text/javascript"> 
@{ 
var arr = new Array[10]; 
var j=0; 

foreach (var node in Model.Children.Where("Visible")) 
{ 
    arr[j][email protected]; 
    j++; 
} 
} 
</script> 

但是這給錯誤加載剃刀腳本getnodes.cshtml 什麼是在代碼中的錯誤?

回答

1

我猜你會得到一個索引越界異常,因爲可能有超過10個節點。

我發現通過將它包裝在try catch中然後輸出錯誤,可以更容易地調試剃刀代碼。請注意,這隻適用於運行時錯誤。

@try 
{ 
    // Initialize list: 
    var list = new List<string>(); 

    // Add each urlname to the list: 
    foreach (var node in Model.Children.Where("Visible")) 
    { 
     list.Add(node.UrlName); 
    } 

    // Serialize and output javascript: 
    <script type="text/javascript"> 
     var arr = @Html.Raw(Json.Encode(list)); 
    </script> 
} 
catch (Exception ex) 
{ 
    @ex.ToString() 
} 

我知道這是一件很難纏的事情。 Razor代碼被評估爲服務器端,並且JavaScript被評估爲客戶端。這意味着他們兩個並沒有真正的合作方式。

我們正在使用腳本標記之間的代碼行寫出將在瀏覽器下載呈現的頁面後運行的JavaScript。就剃刀而言,它只是在那個地方寫出一個字符串。儘管部分語言看起來很相似,但剃鬚刀並不瞭解JavaScript的任何內容。 Json.Encode(剃鬚刀)將您的列表對象序列化爲json。 Html.Raw(剃鬚刀)確保輸出不被編碼。 (刪除並查看瀏覽器中的頁面來源,以瞭解爲什麼這是必要的。)

+0

它給了我下面的異常... Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:不能隱式轉換類型'字符串'到'的System.Array ' 在CallSite.Target(封閉,調用點,對象) 在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRET](調用點站點,T0爲arg0) 在ASP._Page_macroScripts_Relatedlinks1_cshtml.Execute(c)中:\ HostingSpaces \ dadanew \ test.dadabhagwan.org \ wwwroot \ macroScripts \ Relatedlinks1.cshtml:line 28 –

+0

啊,是的,'var arr = new Array [10]'沒有做你期望的事情,我會建議使用'List'代替,然後se如果你想把它解析爲javascript,就可以使用列表。看看我的編輯。 –

+0

嘿thanx ...它解決了......但只是想知道abt的行.... var arr = @ Html.Raw(Json.Encode(list)); .......你能解釋我一樣嗎? –