c#
  • asp.net
  • vb.net
  • .net-2.0
  • 2011-07-27 54 views 2 likes 
    2

    我在aspx中有以下內容。如何防止代碼背後的屬性HTML編碼?

    <html> 
        <body> 
         <input id="but" type="button" value="ClickMe" /> 
        </body> 
    </html> 
    

    背後

    //Pageload 
    but.Attributes.Add("onclick", "this.parentNode.innerHTML += '<a id=""link"" href=""mylink""></a>';document.getElementById(""link"").click();"); 
    

    代碼呈現的HTML

    <input name="ctl00$Content$btn" type="button" id="ctl00_Content_btn" value="ClickMe" 
    onclick="this.parentNode.innerHTML += '&lt;a id=&quot;link&quot; href=&quot;mylink&quot;>&lt;/a>';document.getElementById(&quot;link&quot;).click();" /> 
    

    我怎樣才能獲得<>"字符正確呈現?

    回答

    4

    無法在沒有編碼的情況下渲染這些字符。

    MSDN

    可以客戶端腳本不能添加使用 屬性集合WebControl的實例。要添加客戶端腳本,請使用Page控件上的ClientScript 屬性。

    如果你堅持,只需渲染自己的控制權。

    +0

    有趣的是,他們這麼說。在這個例子中,更進一步,他們完成了他們所說的不該做的事情。 – DJA

    +0

    @DJA他們沒有說不這樣做。他們說,如果你這樣做,這些字符將被編碼在html標籤行上。 – Aristos

    0

    覆蓋渲染的控制方法,並添加這一行:

    base.Attributes.Add("onclick", Page.ClientScript.GetPostBackEventReference(new PostBackOptions(this, string.Empty))); 
    

    在頁面上它應該呈現:

    onclick="__doPostBack('ctl00$ctl00$PageContent$LocalContents$button_id', '')" 
    

    哪個IE應該理解爲一個回傳引用,所以它不應該編碼它。 .net應該與你的服務器端事件處理器匹配起來

    3

    感謝Aristos,這個工程。

    Page.ClientScript.RegisterStartupScript(Me.GetType(), "butClick", "function butClick() {this.parentNode.innerHTML += '<a id=""link"" href=""mylink""></a>';document.getElementById(""link"").click();}") 
    but.Attributes.Add("onclick", "butClick();"); 
    
    +0

    +1感謝您分享最終代碼 – Aristos

    -1
    +0

    我被困在這個項目的.net 2.0中。 –

    +0

    使用反射器或ilspy。反映system.web程序集。從那裏竊取代碼。在2.0中實現它。如果您有困難,請告訴我們。 :) – deostroll

    0

    如果您確實想要阻止參數編碼,您需要創建自己的自定義控件並覆蓋AddAttributesToRender方法。很明顯,這不是很靈活,因爲您需要爲使用的每種類型的控件創建一個單獨的自定義控件。

    幸運的是,這很容易,只需要幾行代碼即可解決。 這裏是需要定製按鈕的完整代碼:

    public class MyCustomButton : Button 
    { 
        protected override void AddAttributesToRender(HtmlTextWriter writer) 
        { 
         base.AddAttributesToRender(writer); 
         writer.AddAttribute("onclick", "myJavascriptFunction('a string');", false); // passing false to the AddAttribute method tells it not to encode this attribute. 
        } 
    } 
    

    顯然,這僅追加一個硬編碼的onclick到的屬性的端部,並且如果已經設置一個onclick可能會干擾。如果你想進一步研究,你可以遍歷實際的Attributes集合並添加它們。

    相關問題