Hej, har en fråga angående det XHTMLStrictFilter som finns här på webforum. När man använder det så slutar mina DropDowns med AutoPostBack att fungera. Någon som har ett workaround på detta, vill ogärna göra mig av med filtret men sidorna är obrukbara om det inte går att köra någon form av autopostback på mina DropDowns? :q
XhtmlStrictFilter och autopostback
14 svar · 548 visningar · startad av Daniel78
Jag får inget felmeddelande utan det är bara det att DropDownen postar inte det valda värdet längre. Det är precis som att AutoPostBack inte fungerar längre när man använder filtret. :(
Filtret tar ju b la bort Name attributet från Form taggen och jag vet inte om det är något sådant som orsakar detta. Men då borde ju de som ev använder detta filter ha reagerat tidigare, eller så är det inte så många som bryr sig om att validera sina sidor? :q
MVH
Daniel
Jag får inget felmeddelande utan det är bara det att DropDownen postar inte det valda värdet längre. Det är precis som att AutoPostBack inte fungerar längre när man använder filtret
Jag läste någonstans att om man skapar egna servercontroller och vill få postbacken att funger så måste man ge kontrollen ett uniktnamn på Name-attribute.
Om man tog bort Name-attributet så fungerade inte postback, så det stämmer ju bra med dina "erfarenheter".
Är det ingen som validerar sina ASP.NET sidor mot W3C standarden på detta forum?
Inte jag! :)
- Magnus
Jag får väl lägga ner mitt arbete med att få denna specifika sida, som använder en DropDown med AutoPostback, att bli validerad XHTML. Jag som ville vara duktig... :stud
MVH
Daniel :birp
jag har suttit och lekt lite med detta filter.
OBESERVERA att detta filter kan innehålla buggar.
[red]
/*
* Written by Mark Pasternak, [email]mark.pasternak@universum.se[/email]
* Feel free to modify
*/
using System;
using System.IO;
using System.Text.RegularExpressions;
namespace NineteenDecember
{
/// <summary>
/// Response Filter that modifies the ASP.NET output so it can validate against the XHTML 1.1 Strict standard.
/// Two things are modified:
/// 1. The form name attribute is removed. Warning, this may break JavaScript code!
/// 2. The viewstate is wrapped in a div element.
/// </summary>
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);
// Tillagd 2004-02-11. Tar bort alla border="0"
private static Regex _regBorder = new Regex("border=[^ ]*", RegexOptions.Compiled|RegexOptions.IgnoreCase);
// Tillagd 2004-03-03. Byter language="javascript" till type="text/javascript"
private static Regex _regType = new Regex("language=\"javascript\"", RegexOptions.Compiled|RegexOptions.IgnoreCase);
// Tillagd 2004-03-03. fixar namnet på formuläret.
private static Regex _regForm1 = new Regex("document.Form1", RegexOptions.Compiled|RegexOptions.IgnoreCase);
private bool _formFix;
private bool _viewStateFix;
private bool _borderFix;
private bool _typeFix;
private bool _form1Fix;
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 || !_borderFix || !this._typeFix || !this._form1Fix)
{
//string htmlOutput = System.Text.UTF8Encoding.UTF8.GetString(buffer);
string htmlOutput = System.Text.Encoding.GetEncoding("iso-8859-1").GetString(buffer);
int length = htmlOutput.Length;
if(!_formFix && _regForm.IsMatch(htmlOutput))
{
string formMatch=_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;
}
if(!_viewStateFix && _regViewState.IsMatch(htmlOutput))
{
string viewStateMatch=_regViewState.Match(htmlOutput).Value;
htmlOutput=Regex.Replace(htmlOutput, "<input type=\"hidden\" name=\"__VIEWSTATE\" value=\".*\" />", "<div>"+viewStateMatch+"</div>", RegexOptions.IgnoreCase);
_viewStateFix=true;
}
// Tillagd 2004-02-11. Tar bort alla border="0"
if(!_borderFix && _regBorder.IsMatch(htmlOutput))
{
string formMatch=_regBorder.Match(htmlOutput).Value;
htmlOutput=Regex.Replace(htmlOutput, _regBorder.Match(formMatch).Value,"", RegexOptions.IgnoreCase);
_borderFix=true;
}
if(!this._typeFix && _regType.IsMatch(htmlOutput))
{
string formMatch=_regType.Match(htmlOutput).Value;
htmlOutput=Regex.Replace(htmlOutput, _regType.Match(formMatch).Value,"type=\"text/javascript\"", RegexOptions.IgnoreCase);
this._typeFix=true;
}
if(!this._form1Fix && _regForm1.IsMatch(htmlOutput))
{
string formMatch=_regForm1.Match(htmlOutput).Value;
htmlOutput=Regex.Replace(htmlOutput, _regForm1.Match(formMatch).Value,"document.forms[0]", RegexOptions.IgnoreCase);
this._form1Fix=true;
}
//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);
}
_sink.Write(data, 0, count);
}
}
}
[/red]
Det jag har gjort är att jag bytt ut language="javascript" till Type. Sen har jag fixat autopostbakcksen (tror jag).
Någon kan väl testa ;)
mv icaaq
Jag har kört med din uppdaterade kod nu och AutoPostBack fungerar nu på en av mina DropDown's som jag testat på! Tack för denna! :birp
Fattar inte varför man vill validera...
Så länge det funkar i de vanligaste webläsarna så spelar det faktiskt ingen som helst roll...
Det spelar en väldig roll.
• Du vet inte hur framtidens webbläsare ser ut.
• Du kan inte kontrollera sidan i alla webbläsare.
• Förhoppningsvis har kunden krav på att sidan ska följa en viss standard.
• Det är dessutom ett bra sätt att visa att man kan HTML.
Om du låter en byggfirma bygga ett hus åt dig och det är snett och skevt och taket är dåligt fastspikat; nöjer du dig då med att byggaren säger:
-"Men det går ju att bo här?"
Bygget måste väl även följa gällande byggregler? ;)
Web-Tor skrev:
Om du låter en byggfirma bygga ett hus åt dig och det är snett och skevt och taket är dåligt fastspikat; nöjer du dig då med att byggaren säger:
-"Men det går ju att bo här?"
Bygget måste väl även följa gällande byggregler? ;)
Håller med till punkt och pricka, men en liten parentes i ämnet är att byggfirman inte autogenererar fönster och dörrar som en webbserverkontroll gör. ;)
Nej jag håller inte riktigt med.
Ja självklart ska byggkillarna bygga efter en viss standard. Men standarden bygger jue inte på ett par färdiga regler som valideringen gör. Utan den ska klara av vissa saker. Hur man löser det är en annan fråga.
Menar så länge huset är isolerat, rören inte läcker och elen är dragen på rätt sätt har du ett fungerande hus.
Men men...jag tycker fortfarande att validering är lite att ta i.
Nej man kan inte testa det i alla webbläsare som finns. Men man kan med enkla medel täcka upp ca 99%.
En sak vi kan vara rätt så säkra på är att framtidens webbläsare kommer att vara bakåtkompatibla.
Om kunden ska ha ett krav så ska det vara att den funkar för de stora webbläsarna. Inte att den följer en standard. För standarden funkar inte heller fullt ut på alla webbläsare idag.
En sak vi kan vara rätt så säkra på är att framtidens webbläsare kommer att vara bakåtkompatibla.
Ja, de ska klara av äldre HTML-standarder.
Netscape 6 stöder inte allt som Netscape 4 gjorde. Däremot stödjer Netscape 6 HTML-standarden.
Men standarden bygger jue inte på ett par färdiga regler som valideringen gör. Utan den ska klara av vissa saker. Hur man löser det är en annan fråga.
På samma sätt talar inte HTML-standarden om hur din webbsida ska se ut, inte heller hur du ska lösa det. Däremot talar den om vad som är tillåtet och vad som inte är tillåtet.
När webbsidan är klar ska den valideras. Innan du får flytta in i huset ska det besiktigas.
Om kunden ska ha ett krav så ska det vara att den funkar för de stora webbläsarna.
Men det är ju inte webbutvecklaren som bestämmer vad kunden har för krav. Det finns EU-direktiv som säger att myndigheter och liknande ska uppfylla vissa WAI-krav. Där ingår bland annat att koden ska följa HTML-standarden.
För standarden funkar inte heller fullt ut på alla webbläsare idag.
Självklar ska man även testa sidan i de webbläsare som majoriteten av målgruppen använder.
Oki...
Ska hoppas få myndighet som kund då :)