webForumDet fria alternativet

XHTMLStrictFilter problem med java script

15 svar · 348 visningar · startad av Mc Fetto

Mc FettoMedlem sedan nov. 20022 355 inlägg
#1

Jag använder mig av XHTMLStrictFilter, och det fungerar finfint att validera sidorna. Problemet är när jag har en LinkButton:

		private void LinkButton6_Click(object sender, System.EventArgs e)
		{
			Response.Cookies["t"].Expires = DateTime.Now.AddDays(-1);
			Session["UserName"] = null;
		}

När jag använder filtret får jag upp java script error och om jag inte använder det fungerar det som det ska...

Det enda som skiljer sig åt i källkoden är:
med filter:

<form  method="post" action="index.aspx" id="Form1">

utan:

<form name="Form1" method="post" action="index.aspx" id="Form1">

alltså name-attributet.. What to do??

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Det där är ju server-kod, väl? Hur ser javascript-koden ut?

Mc FettoMedlem sedan nov. 20022 355 inlägg
#3

De två sista kodsnuttarna i inlägget ovan är från klientsidan.

	function __doPostBack(eventTarget, eventArgument) {
		var theform;
		if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1) {
			theform = document.Form1;
		}
		else {
			theform = document.forms["Form1"];
		}
		theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
		theform.__EVENTARGUMENT.value = eventArgument;
		theform.submit();
	}

Så här ser scriptet ut och det är likadant både med och utan filtret!

nitro2k01Medlem sedan aug. 20039 342 inlägg
#4
 
function __doPostBack(eventTarget, eventArgument) {
  var theform;
  if (!(theform = document.getElementById("Form1")))
    if (window.navigator.appName.toLowerCase().indexOf("microsoft") > -1)
      theform = document.Form1;
    else
      theform = document.forms["Form1"];
  theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
  theform.__EVENTARGUMENT.value = eventArgument;
  theform.submit();
}

/r Fixade indenteringen
/r igen: Tog bort onödiga måsvingar.

Mc FettoMedlem sedan nov. 20022 355 inlägg
#5

Jaha, det verkar ju bra (kan noll javascript). Hur får jag sedan filtret att skapa detta istället för mitt!?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#6

Filtret? Kan du inte bara redigera koden?

Mc FettoMedlem sedan nov. 20022 355 inlägg
#7

Nej det är ju kod som genereas "on the fly" från asp.net

Mc FettoMedlem sedan nov. 20022 355 inlägg
#8

Har surfat runt lite och min klass kan vara "omodern", så om någon har en modifierad, nyare version av klassen så posta för guds skull ;)

	public class XHTMLStrictFilter : Stream 
	{ 
		private Stream _sink; 
		private long _position; 

		private static Regex _regForm = new Regex("<form .*name=.* .*>", RegexOptions.Compiled|RegexOptions.IgnoreCase); 
		private static Regex _regNameReplace = new Regex("name=[^ ]*", RegexOptions.Compiled|RegexOptions.IgnoreCase); 
		private static Regex _regViewState = new Regex("<input type=\"hidden\" name=\"__VIEWSTATE\" value=\".*\" />", RegexOptions.Compiled|RegexOptions.IgnoreCase); 

		private bool _formFix; 
		private bool _viewStateFix; 

		public XHTMLStrictFilter(Stream sink) 
		{ 
			_sink = sink; 
		} 

		// The following members of Stream must be overriden. 
		public override bool CanRead 
		{ 
			get { return true; } 
		} 

		public override bool CanSeek 
		{ 
			get { return true; } 
		} 

		public override bool CanWrite 
		{ 
			get { return true; } 
		} 

		public override long Length 
		{ 
			get { return 0; } 
		} 

		public override long Position 
		{ 
			get { return _position; } 
			set { _position = value; } 
		} 

		public override long Seek(long offset, System.IO.SeekOrigin direction) 
		{ 
			return _sink.Seek(offset, direction); 
		} 

		public override void SetLength(long length) 
		{ 
			_sink.SetLength(length); 
		} 

		public override void Close() 
		{ 
			_sink.Close(); 
		} 

		public override void Flush() 
		{ 
			_sink.Flush(); 
		} 

		public override int Read(byte[] buffer, int offset, int count) 
		{ 
			return _sink.Read(buffer, offset, count); 
		} 

		// The Write method actually does the filtering. 
		public override void Write(byte[] buffer, int offset, int count) 
		{ 
			byte[] data; 

			if(!_formFix || !_viewStateFix) 
			{ 
				string htmlOutput = System.Text.UTF8Encoding.UTF8.GetString(buffer); 
				int length = htmlOutput.Length; 
				if(!_formFix && _regForm.IsMatch(htmlOutput)) 
				{ 
					string formMatch=_regForm.Match(htmlOutput).Value; 
					htmlOutput=Regex.Replace(htmlOutput, formMatch, _regNameReplace.Replace(formMatch, ""), RegexOptions.IgnoreCase); 
					_formFix=true; 
				} 
				if(!_viewStateFix && _regViewState.IsMatch(htmlOutput)) 
				{ 
					string viewStateMatch=_regViewState.Match(htmlOutput).Value; 
					htmlOutput=Regex.Replace(htmlOutput, viewStateMatch, "<div>"+viewStateMatch+"</div>", RegexOptions.IgnoreCase); 
					_viewStateFix=true; 
				} 
				data = System.Text.UTF8Encoding.UTF8.GetBytes(htmlOutput); 
				count -= length - htmlOutput.Length; 
			} 
			else 
			{ 
				data = new byte[count]; 
				Buffer.BlockCopy(buffer, offset, data, 0, count); 
			} 
			_sink.Write(data, 0, count); 
		} 
	}
}
Mc FettoMedlem sedan nov. 20022 355 inlägg
#9

Ingen, det är ju ett par anändare på forumet som uppenbarligen använt sig av denna klass. Har sök men inte hittat lösning på just detta problemet. Har ingen av er som använt klassen stött på mitt problem?

Daniel78Medlem sedan jan. 2001200 inlägg
#10

Hej,

Denna typ av problem löste vi i denna tråd:
XHTMLStrictFilter och autopostback

Skillnaden var att här fungerade det inte att göra autopostback från en listbox pga att filtret plockade bort "name" attributet från listboxen, filtret som finns i denna tråd, löste dock problemet.

MVH
Daniel

Mc FettoMedlem sedan nov. 20022 355 inlägg
#11

mm, tittade på den tidigare men då får jag två type attribut i javascripttaggen :(

Daniel78Medlem sedan jan. 2001200 inlägg
#12

Okej, jag har nog löst det i min version för den blir validerad. Men jag är på jobbet nu så jag får bifoga den ikväll.

Mvh
Daniel

Mc FettoMedlem sedan nov. 20022 355 inlägg
#13

Daniel78 skrev:

Okej, jag har nog löst det i min version för den blir validerad. Men jag är på jobbet nu så jag får bifoga den ikväll.

Mvh
Daniel

Det får du gärna göra! :bire

Daniel78Medlem sedan jan. 2001200 inlägg
#14

Jag lovar att jag ska försöka få hit koden ikväll, har haft lite annat att göra nu några kvällar och helt enkelt glömt bort att skicka. :r

Mvh
Daniel

Daniel78Medlem sedan jan. 2001200 inlägg
#15

Här är koden:

Public Class XHTMLStrictFilter
    Inherits Stream
    Private _sink As Stream
    Private _position As Long

    Private Shared _regForm As New Regex("<form .*name=.* .*>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    Private Shared _regNameReplace As New Regex("name=[^ ]*", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    Private Shared _regViewState As New Regex("<input type=""hidden"" name=""__VIEWSTATE"" value="".*"" />", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    ' Tillagd 2004-02-11. Tar bort alla border="0"
    Private Shared _regBorder As New Regex("border=[^ ]*", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    ' Tillagd 2004-03-03. Byter language="javascript" till type="text/javascript"
    Private Shared _regType As New Regex("language=""javascript""", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    ' Tillagd 2004-03-03. fixar namnet på formuläret.
    Private Shared _regForm1 As New Regex("document.Form1", RegexOptions.Compiled Or RegexOptions.IgnoreCase)

    Private _formFix As Boolean
    Private _viewStateFix As Boolean
    Private _borderFix As Boolean
    Private _typeFix As Boolean
    Private _form1Fix As Boolean

    Public Sub New(ByVal sink As Stream)
        _sink = sink
    End Sub 'New

    ' The following members of Stream must be overriden.

    Public Overrides ReadOnly Property CanRead() As Boolean
        Get
            Return True
        End Get
    End Property

    Public Overrides ReadOnly Property CanSeek() As Boolean
        Get
            Return True
        End Get
    End Property

    Public Overrides ReadOnly Property CanWrite() As Boolean
        Get
            Return True
        End Get
    End Property

    Public Overrides ReadOnly Property Length() As Long
        Get
            Return 0
        End Get
    End Property

    Public Overrides Property Position() As Long
        Get
            Return _position
        End Get
        Set(ByVal Value As Long)
            _position = value
        End Set
    End Property

    Public Overrides Function Seek(ByVal offset As Long, ByVal direction As System.IO.SeekOrigin) As Long
        Return _sink.Seek(offset, direction)
    End Function 'Seek

    Public Overrides Sub SetLength(ByVal length As Long)
        _sink.SetLength(length)
    End Sub 'SetLength

    Public Overrides Sub Close()
        _sink.Close()
    End Sub 'Close

    Public Overrides Sub Flush()
        _sink.Flush()
    End Sub 'Flush

    Public Overrides Function Read(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer) As Integer
        Return _sink.Read(buffer, offset, count)
    End Function 'Read

    ' The Write method actually does the filtering.
    Public Overrides Sub Write(ByVal buffer() As Byte, ByVal offset As Integer, ByVal count As Integer)
        Dim data() As Byte

        If Not _formFix Or Not _viewStateFix Or Not _borderFix Or Not Me._typeFix Or Not Me._form1Fix Then
            'string htmlOutput = System.Text.UTF8Encoding.UTF8.GetString(buffer);
            Dim htmlOutput As String = System.Text.Encoding.GetEncoding("iso-8859-1").GetString(buffer)
            Dim length As Integer = htmlOutput.Length
            If Not _formFix And _regForm.IsMatch(htmlOutput) Then
                Dim formMatch As String = _regForm.Match(htmlOutput).Value

                ' *** Borttagen 03-06-17 ***
                ' *** htmlOutput=Regex.Replace(htmlOutput, formMatch, _regNameReplace.Replace(formMatch, ""), RegexOptions.IgnoreCase);
                htmlOutput = Regex.Replace(htmlOutput, _regNameReplace.Match(formMatch).Value, "", RegexOptions.IgnoreCase)
                _formFix = True
            End If
            If Not _viewStateFix And _regViewState.IsMatch(htmlOutput) Then
                Dim viewStateMatch As String = _regViewState.Match(htmlOutput).Value
                htmlOutput = Regex.Replace(htmlOutput, "<input type=""hidden"" name=""__VIEWSTATE"" value="".*"" />", "<div>" + viewStateMatch + "</div>", RegexOptions.IgnoreCase)
                _viewStateFix = True
            End If
            ' Tillagd 2004-02-11. Tar bort alla border="0"
            If Not _borderFix And _regBorder.IsMatch(htmlOutput) Then
                Dim formMatch As String = _regBorder.Match(htmlOutput).Value
                htmlOutput = Regex.Replace(htmlOutput, _regBorder.Match(formMatch).Value, "", RegexOptions.IgnoreCase)
                _borderFix = True
            End If
            If Not Me._typeFix And _regType.IsMatch(htmlOutput) Then
                Dim formMatch As String = _regType.Match(htmlOutput).Value
                htmlOutput = Regex.Replace(htmlOutput, _regType.Match(formMatch).Value, "type=""text/javascript""", RegexOptions.IgnoreCase)
                Me._typeFix = True
            End If
            If Not Me._form1Fix And _regForm1.IsMatch(htmlOutput) Then
                Dim formMatch As String = _regForm1.Match(htmlOutput).Value
                htmlOutput = Regex.Replace(htmlOutput, _regForm1.Match(formMatch).Value, "document.forms[0]", RegexOptions.IgnoreCase)
                Me._form1Fix = True
            End If
            'data = System.Text.UTF8Encoding.UTF8.GetBytes(htmlOutput);
            data = System.Text.Encoding.GetEncoding("iso-8859-1").GetBytes(htmlOutput)
            count -= length - htmlOutput.Length
        Else
            data = New Byte(count) {}
            'Buffer.BlockCopy(buffer, offset, data, 0, count)
        End If
        _sink.Write(data, 0, count)
    End Sub 'Write
End Class 'XHTMLStrictFilter
Mc FettoMedlem sedan nov. 20022 355 inlägg
#16

Tackar :) nu sket sig bara all layout buhuu.
Men det går nog att ordna!

133 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)