2013-08-06 6 views
9

.Net 4.0 koduje pojedyncze cudzysłowy, gdy używam Attributes.Add, aby dodać zdarzenia po stronie klienta do moich obiektów asp.net. W poprzednich wersjach tak się nie stało..Net 4.0 koduje pojedynczy cudzysłów podczas używania Attributes.Add

na przykład:

<asp:Image runat="server" ID="imgTest" ImageUrl="~/DateControl/cal.gif" /> 

imgTest.Attributes.Add("onmouseover", "alert('Hello')"); 

Kiedy przeglądać dane wyjściowe po stronie klienta, jestem coraz

<img id="ctl00_MainContent_calFromTimeStamp1_imgTest" onmouseover="alert(&#39;Hello&#39;)" src="../DateControl/cal.gif" style="border-width:0px;" /> 

znalazłem obejście poprzez tworzenie niestandardowych koder: creating custom encoding routines ale nie chcą Zatrzymaj kodowanie całej witryny tylko z powodu tego problemu. Ktoś ma obejście lub pomysł, jak to naprawić?

Odpowiedz

0

Dzięki Franzo na link, gdzie następującą odpowiedź zostanie skopiowany i wklejony:

można wyłączyć kodowanie atrybutu tworząc klasę tak:

public class HtmlAttributeEncodingNot : System.Web.Util.HttpEncoder 
{ 
    protected override void HtmlAttributeEncode(string value, System.IO.TextWriter output) 
    { 
     output.Write(value); 
    } 
} 

i dodawanie to do web.config pod:

<httpRuntime encoderType="HtmlAttributeEncodingNot"/> 

To daje mi kontrolę, jakiej potrzebuję.

Jednak teraz musimy martwić się, że nowe kontrole mogą zależeć od nowego standardowym 4,0 zachowań i nie kodować apostrofów, więc to jeszcze niedoskonały, ba, gorzej niż niedoskonałe: bezpieczeństwo jest jeszcze gorzej, bo możemy don” wiesz, co się dzieje, więc naprawdę nie jest to wspaniałe rozwiązanie.

Myślę, że tylko firma Microsoft może to naprawić prawidłowo. Inni zasugerowali zapotrzebowanie na klasę HtmlAttributeString tutaj: link Jeśli istnieje , to taka klasa i Atrybuty.Add może przyjąć obiekt taki jak ten dla swojego parametru wartości, a następnie uzyskalibyśmy kontrolę, którą potrzebowalibyśmy ponownie .

0

imgTest.Attributes.Add("onmouseover", "alert(\'Hello\')");

+1

ten nie działał –

4

Według Microsoftu nie powinno być dodanie JavaScript do atrybutów HTML za pomocą WebControl.Attributes.Add(), dokładnie ponieważ będzie kodować wartość atrybutu:

Nie można dodać skrypt po stronie klienta do instancji WebControl przy użyciu kolekcji atrybutów . Aby dodać skrypt po stronie klienta, należy użyć właściwości ClientScript na formancie Strona.

Source

Porada jest użycie Page.ClientScript.RegisterExpandoAttribute(string controlId, string attributeName, string attributeValue, bool encode)method. W Twoim przypadku będzie to wyglądać tak:

Page.ClientScript.RegisterExpandoAttribute(
    imgTest.ClientID, 
    "onmouseover", 
    "alert('Hello')", 
    false /* Do not encode */ 
); 

Spowoduje to utworzenie na stronie skryptu JavaScript, który ustawi atrybut po stronie klienta.

+3

Skrypt Java, który ustawia po stronie klienta attirbute było, ale ogień nie zrobił wydarzenie, próbowałem go na Chrome i IE –

+0

samo tutaj - Widzę skrypt, aby dodać atrybut - ale nie uruchamia się. – Ian

0

Nie zaleca się wyłączania kodowania atrybutów. Jeśli domyślnie próbujesz zapobiec kodowaniu, w twoim kodzie pojawi się wiele dziwnych zachowań i będziesz musiał zapłacić cenę za złe praktyki.

.NET zawsze koduje wszystkie atrybuty, które przestaną być wstrzykiwane złośliwym skryptom. Powinieneś przejść przez tę domyślną praktykę, aby chronić swój program.

1

Najlepszym sposobem, aby ustawić atrybuty zdarzenia w .NET jest zadzwonić jedną funkcję:

imgTest.Attributes("message") = "Hello"; 
imgTest.Attributes("onmouseover") = "showMessage(this);" 

A na swojej stronie lub zarejestrowanego skrypt:

function showMessage(ctrl) 
{ 
    alert(ctrl.getAttribute('message')); 
} 
+0

Podany przykład nie jest tak naprawdę rozwiązaniem, ponieważ tekst, którego używasz, nie zawiera cudzysłowów. Rozważmy to: 'link.Attributes [" my_command "] =" myfunc ("hello world") "; link.Attributes ["onclick"] = "eval (this.my_command)"; '. Nowy atrybut 'my_command' zostaje zakodowany, ale jest dekodowany metodą' eval() '. – paul

-2

można użyć znaku ucieczki przed jakimkolwiek charakterze Cytat:

Źródło:

this.Attributes.Add("onmouseover", string.Format("$(this).attr(\'src\',\'{0}\')",this.Page.ClientScript.GetWebResourceUrl(typeof(SwapImage), urlenabledkey))); 

Render:

onmouseover="$(this).attr('src','/WebResource.axd?d=kHY3FE9nMsUOvDU-pPthg4KQvVrnXlcASyA7dFf6L 
Powiązane problemy