Történt, hogy a Moxicode TinyMCE editor-ját szerettem volna használni egy MVC alkalmazásban - a válaszott platform és az IDE pedig természetesen mi más is lehetett volna, mint a .NET Framework 4.0 RC, illetve a Visual Studio 2010 RC.
Némi plumbing kód megírása után az elgondolás életre is kelt és prímán működött - egészen az első POST-ig, amiután a "System.Web. HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (form-elem-neve="veszélyes-dolgok-pl-html")." üzenettel elragadott a Sárga Halál. Hát, persze, ilyesmit nem lehet POST-olni, mert a HTTP request validációja során az ASP.NET motor megtagadja a kérés viszolgálását, ha valami potenciálisan veszélyeset (pl. HTML kódot) talál a POST-olt értékek közt. Ki kell kapcsolni a validációt az adott oldalra.
Mi sem egyszerűbb ennél, az .aspx oldalunk @Page direktívájánál megmondjuk, hogy ValidateRequest="false", és kész is vagyunk.
Illetve lennénk, ha ez egy WebForms alkalmazás lenne. Az MVC applikációnkat teljes mértékben hidegen hagyja ez a beállítás, és továbbra is validál. Kis keresés, és halleluja: az MVC motor máshol validál, mint a WebForms, itt a Controller feladata a validálás, és az Action-ökre rakott [ValidateInput] attribútummal szabályozhatjuk, hogy szeretnénk-e validálást, vagy sem. Editálás esetén nem akartam:
[ValidateInput(false)]
public ActionResult Edit(string id)
{
return View();
}
Egyszerű - viszont ugyanúgy nem működött, mint az előző megközelítés. Itt már hosszabb és keservesebb nyomozás következett, de végül meglett az ok: ASP.NET 4.0 Beta 2-től megváltozott a default request-validálási módszer, már a BeginRequest alatt megtörténik. A változtatás azt célozza, hogy a request validation áldásos tevékenységét ne csak .aspx oldalakon, hanem webservice híváson, handlereken, egyebeken is élvezhessük.
Hogy ezt az új fajta validációt hogy lehet kikapcsolni, nem tudom; de vissza lehet térni a "régihez", ami tiszteletben tartja a direktívákat és attribútumokat, mindössze egy sort kell elhelyeznünk a Web.configunkban:
<httpRuntime requestValidationMode="2.0" />
Szintén 4.0-ás újdonság, hogy saját validátort is készíthetünk, amit szintén a httpRuntime elem attribútumaként adhatunk meg:
<httpRuntime requestValidationType="MyValidator, MyAssembly" />
Végezetül, ha kikapcsoljuk a "gyári" validációt, ne feledkezzünk meg helyette saját ellenőrző kódokat beépíteni.
Boldog Validálást!