簡體   English   中英

ASP.NET內聯服務器標簽

[英]ASP.NET inline server tags

我想首先說我的代碼工作正常,這更像是一個“如何做到最好”的問題。

所以我的.aspx文件中有這樣的代碼:

    function EditRelationship() {
        var projects=<%= GetProjectsForEditRelationship() %>;

        // fill in the projects list
        $('#erProjectsSelect').empty();
        for(var i in projects)
            $('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');

        var rels=<%= GetRelationshipsForEditRelationship() %>;

        // etc
    }

再次,它工作正常。 問題是VS2008對這樣的代碼有點窒息,它強調了標簽中的<字符(帶有相關警告),然后拒絕為其余的javascript提供代碼完成。 它也拒絕格式化我的文檔,給出解析錯誤 最后一部分是我最煩惱的事。

我可以把它們中的一些放進eval ,但是添加額外的圖層和運行時性能命中只是為了關閉VS,這似乎有點愚蠢,而且它並不總是一個選項(我不記得我的頭頂在哪里這不是一個選擇,但相信我,我有一個奇怪的結構)。

所以我的問題是, 你如何最好地寫這個 (哪里最好意味着VS投訴最少)? eval和ajax調用都不適合這個imo。

您可以在代碼隱藏中從您的頁面執行此操作

ClientScript.RegisterArrayDeclaration("projects", "1, 2, 3, 4");

或者構建類似JSON的東西,你可以寫出來

ClientScript.RegisterClientScriptBlock(GetType(), "JSONDeclarations", "your json stuff");

更新根據我的評論

<script id="declaration" type="text/javascript">
    var projects=<%= GetProjectsForEditRelationship() %>;
    var rels=<%= GetRelationshipsForEditRelationship() %>;
</script>
<script type="text/javascript">
    function EditRelationship() {
        // fill in the projects list
        $('#erProjectsSelect').empty();
        for(var i in projects)
            $('#erProjectsSelect').append('<option value='+projects[i][0]+'>'+projects[i][1]+'</option>');
}
</script>

如果您的目標是減少VS投訴,並且如果您正在運行asp.net 4(支持靜態客戶端ID),那么像以下這樣的策略會更好嗎?

  1. 創建一個ASP:HiddenField控件,將其ClientIdMode設置為“Static”
  2. 在頁面加載時將GetRelationshipsForEditRelationship()的值分配給此字段
  3. 在您的javascript中,請從隱藏字段中讀取值,我假設您知道如何執行此操作。

這比你的解決方案更多的工作,你將添加一些數據到回發(如果你執行任何)但它不會導致任何VS投訴我猜:)

最好的解決方案是將javascript放在一個單獨的文件中,並完全避免這種情況。 對於這個特定的功能,你正在做服務器端的工作。 為什么不構建你想要在代碼隱藏中動態添加的選項列表,將它們放在一個隱藏的div中,然后讓jQuery從已經呈現的HTML中添加它們?

如果您確實希望以這種方式動態創建很多javascript,請考慮在代碼隱藏中使用ScriptManager來設置您需要的變量作為腳本並注冊它們,然后您的內聯腳本將不需要轉義

ScriptManager.RegisterClientScript("projects = " + GetProductsForEditRelationship());

(基本上,這不是完整的語法,它取決於上下文)。 然后參考函數中的“項目”。

(編輯)

更大規模地執行此操作的一種更簡潔的方法,在代碼隱藏中設置您需要的所有內容:

string script = "var servervars = {" +
  "GetProductsForEditRelationship: " + GetProductsForEditRelationship() + 
  "GetRelationshipsForEditRelationship: " + GetRelationshipsForEditRelationship() +
"}"

並指的是:

servervars.GetProductsForEditRelationship

當然,如果你這么做了很多,你可以創建一個類來自動構建腳本。

我沒有安裝VS2008進行測試,所以帶上一粒鹽,但你有沒有試過這樣的東西?

var projects = (<%= GetProjectsForEditRelationship() %>);

這樣的事情可能會欺騙JavaScript解析器忽略表達式的內容。

對於它的價值,VS2010正確解析並突出顯示您的原始代碼段。

是否可以將其移至VS2010? 我只是復制並粘貼了你的代碼,IDE正確地解釋了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM