Har problem med AutoPostBack, Validatorerna och allt annat som använder javascript i ASP.Net eftersom idioterna som programmerade dessa kontroller satte xml-kommentarer runt om scripten. Alltså läses inte skripten in...
Du får skapa en egen class som ärver från System.Web.UI.Page som overridar render-metoden. Rätt klöddigt egentligen, får fan hoppas på att detta problem fixas till i 2.x så att man kan köra asp.net-sidor i xhtml 1.1.
Du får kolla över hur koden för render-metoden ser ut i en vanlig system.web.ui.Page i Code Definition Window eller med hjälp av ILDASM (Om det nu är helt möjligt att få ut källkoden). Sen får du leta upp de element som renderar javascripten och slänga in cdata istället för xml-kommentarer runt dessa. Tippar på att det är relativt jobbigt att få det helt hundraprocentigt.
System.Web.UI.ClientScriptManager var det alltså. Nu har jag ju hittat exakt var den skriver ut sina dumma kommentarer - men egentligen - vad jag vill göra är att förändra System.Web.UI.ClientScriptManager's RegisterStartupScript så att den byter ut
"\r\n<!--\r\n" till "\r\n//<![CDATA[\r\n" samt på andra sidan strängen.
Ok, så jag kollade i den metoden och där verkar själva logiken hända, förutom en hel del kollar om IsClientScriptRegistered i själva basevalidator. Men här börjar den kolla många olika metoder, så här vore nog bäst att lägga kollen om kommentarerna är i strängen... Någon som vet hur man kan göra detta?
Tack för hjälpen Sebbe! Projektet du länkade till funkar väldigt bra på att byta ut kommentarerna mot cdata. Nu hade jag både velat markera ditt inlägg som slutgiltigt svar och det här, men eftersom jag lägger in koden på min fråga här:
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Henrik.Xhtml
{
/// <summary>
/// Inherits System.Web.UI.Page and makes all scripts standards compliant,
/// i.e. removes the xml comments.
/// </summary>
public class Page : System.Web.UI.Page
{
private string strXhtmlMarkup;
public Page()
{
strXhtmlMarkup = "";
}
protected override void Render(HtmlTextWriter output)
{
StringWriter w = new StringWriter();
HtmlTextWriter myoutput = new HtmlTextWriter(w);
base.Render(myoutput);
myoutput.Close();
strXhtmlMarkup = w.GetStringBuilder().ToString();
maskScript();
output.Write(strXhtmlMarkup);
}
private void maskScript()
{
// Add <![CDATA[ ... ]]> to mask script
strXhtmlMarkup = Regex.Replace(strXhtmlMarkup,
@"(<script[^<]*>){1}(?(?=\s*<!--)(\s*<!--)(\s*.*?)(//\s*-->)|(\s*.*?))\s*(</script>){1}",
new MatchEvaluator(FixStyleAndScript),
RegexOptions.IgnoreCase | RegexOptions.Singleline);
}
private string FixStyleAndScript(Match m)
{
string ret = "";
string st, ed;
st = "\r\n<![CDATA[\r\n";
ed = "\r\n]]>\r\n";
if (m.Groups[2].ToString().Trim() == "" && m.Groups[4].ToString().Trim() == "")
st = ed = "";
ret = m.Groups[1].ToString() + st;
ret += m.Groups[2].ToString() + m.Groups[4].ToString() + ed + m.Groups[5].ToString();
return ret;
}
}
}
Så i er sida ärver ni den här klassen:
public partial class katalog_sidan: Henrik.Xhtml.Page
Detta fungerar för master pages också. När jag har klurat ut hur man gör med .Net lite, eller mobile controls så skriver jag in koden för dem, här med, om det är någon skillnad.
Detta skapar en bug som gör att om man har javascript på, och har markören i en textarea/en asp:textbox multiline kontroll, så utförs Submit() eventet på ditt form om du trycker ENTER.
echo:
Du bör ändra lite i din kod för att det ska fungera i alla webbläsare.
The problem is that some older web browsers don't understand the CDATA tag and so this breaks your Javascript in those web browsers. Fortunately, Javascript multi-line comments start and finish with characters that do not cause validation errors. We can therefore comment out the CDATA tag in so far as the Javascript processors within the web browsers are concerned while still leaving the Javascript content defined as CDATA as far as the validator is concerned.