Mc FettoMedlem sedan nov. 20022 355 inlägg 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??
Det där är ju server-kod, väl? Hur ser javascript-koden ut?
Mc FettoMedlem sedan nov. 20022 355 inlägg 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!
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 Jaha, det verkar ju bra (kan noll javascript). Hur får jag sedan filtret att skapa detta istället för mitt!?
Filtret? Kan du inte bara redigera koden?
Mc FettoMedlem sedan nov. 20022 355 inlägg Nej det är ju kod som genereas "on the fly" från asp.net
Mc FettoMedlem sedan nov. 20022 355 inlägg 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 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 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 mm, tittade på den tidigare men då får jag två type attribut i javascripttaggen :(
Daniel78Medlem sedan jan. 2001200 inlägg 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
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 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 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 Tackar :) nu sket sig bara all layout buhuu.
Men det går nog att ordna!