webForumDet fria alternativet

Få inbyggda komponenterna att fungera?

.NET

11 svar · 559 visningar · startad av echoSwe

Medlem sedan nov. 20041 189 inlägg
Frågan#1

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...

Hur får man bort

[b]<!--[/b]
...
[b]-->[/b]

? Någon?

Vi kan till och med byta ut det mot:

//<![CDATA[
...
//]]>

:)

Medlem sedan nov. 20041 189 inlägg
#2

Bump.

Medlem sedan dec. 19996 522 inlägg
#3

Vad är problemet, förstår det inte riktigt

Medlem sedan nov. 20041 189 inlägg
#4

Om man skickar en html fil som
application/xhtml+xml

Så kommenterar ASP.Net bort sina egna script.

Medlem sedan nov. 20041 189 inlägg
#5

???

Medlem sedan dec. 200471 inlägg
#6

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.

Medlem sedan nov. 20041 189 inlägg
#7

Hur får jag ut exakt rätt client side script från rendermetoden i så fall?

Medlem sedan dec. 200471 inlägg
#8

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.

EDIT:
Hittade ett litet intressant projekt när jag googlade: http://www.codeproject.com/aspnet/ASPNET2XHTML.asp?df=100&forumid=111592&exp=0&select=976182 . Hittade bland annat följande snutt där i:

private void maskScript()
{
      // Add <![CDATA[ ... ]]> to mask script
      m_sXHTML = Regex.Replace(m_sXHTML, @"(<script[^<]*>){1}(?(?=\s*<!--)(\s*<!--)(\s*.*?)(//\s*-->)|(\s*.*?))\s*(</script>){1}", new MatchEvaluator(FixStyleAndScript), RegexOptions.IgnoreCase | RegexOptions.Singleline);
}
Medlem sedan nov. 20041 189 inlägg
#9

Okej, så jag hittade strängen som skriver ut scriptet till page.

.field private static literal string ValidatorStartupScript = "\r\n<script type=\"text/javascript\">\r\n<!--\r\nvar Page_"
+ "ValidationActive = false;\r\nif (typeof(ValidatorOnLoad) == \"function\") {\r\n    ValidatorOnLoad();\r\n}\r\n\r\nfunction V"
+ "alidatorOnSubmit() {\r\n    if (Page_ValidationActive) {\r\n        return ValidatorCommonOnSubmit();\r\n    }\r\n    el"
+ "se {\r\n        return true;\r\n    }\r\n}\r\n// -->\r\n</script>\r\n        "

Det är en "private static literal" sträng i System.Web.UI.WebControls.BaseValidator som i sin tur tex. "RequiredFieldValidator" ärver.

Sen finns det en till intressant sträng som jag inte har sett tidigare: ValidatorFileName som ser ut såhär:

.field private static literal string ValidatorFileName = "WebUIValidation.js"

Sedan, i samma klass, dvs. BaseValidator finns den här koden:

  IL_0041:  ldarg.0
  IL_0042:  callvirt   instance class System.Web.UI.Page System.Web.UI.Control::get_Page()
  IL_0047:  callvirt   instance class System.Web.UI.ClientScriptManager System.Web.UI.Page::get_ClientScript()
  IL_004c:  ldtoken    System.Web.UI.WebControls.BaseValidator
  IL_0051:  call       class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
  IL_0056:  ldstr      "ValidatorIncludeScript"
  IL_005b:  ldstr      "\r\n<script type=\"text/javascript\">\r\n[b]<!--[/b]\r\nvar Page_"
  + "ValidationActive = false;\r\nif (typeof(ValidatorOnLoad) == \"function\") {"
  + "\r\n    ValidatorOnLoad();\r\n}\r\n\r\nfunction ValidatorOnSubmit() {\r\n    if ("
  + "Page_ValidationActive) {\r\n        return ValidatorCommonOnSubmit();\r\n  "
  + "  }\r\n    else {\r\n        return true;\r\n    }\r\n}\r\n// [b]-->[/b]\r\n</script>\r\n   "
  + "     "
  IL_0060:  callvirt   instance void System.Web.UI.ClientScriptManager::RegisterStartupScript(class [mscorlib]System.Type,
                                                                                              string,
                                                                                              string)

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?

Medlem sedan nov. 20041 189 inlägg
#10

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.

Medlem sedan nov. 20041 189 inlägg
#11

På tal om inbyggda komponenter som inte fungerar korrekt:

<form method="post" action="Offert.aspx" onsubmit="javascript:return WebForm_OnSubmit();" 
onkeypress="javascript:return [b]WebForm_FireDefaultButton(event, 'ctl00_btnInlogg')[/b]" id="aspnetForm">

läggs till om man skriver:

<form id="form1" [b]defaultbutton="btnInlogg"[/b] runat="server">

i sin kod.

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.

Ska kolla lite på http://www.cs.tut.fi/~jkorpela/forms/enter.html och se om man kan göra om javascriptet genom min ovanstående klass, en aning för att få det att funka som det ska...

Medlem sedan dec. 200471 inlägg
#12

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.

http://javascript.about.com/library/blxhtml.htm

Byt:
st = "\r\n<![CDATA[\r\n";
ed = "\r\n]]>\r\n";

Till:
st = "\r\n/*<![CDATA[*/\r\n";
ed = "\r\n/*]]>*/\r\n";
271 ms totalt · 4 externa anrop · v20260731065814-full.2f471f9e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)