Das ASP.NET Framework validiert einkommende Requests ob diese <html> Elemente enthalten oder nicht. Dies soll Script-Injection vorbeugen. Ab und an braucht will man aber dieses verhalten nicht. Bis zu .NET 3.5 Zeiten brauchte man über ASP.NET MVC Actions einfach nur das Attribut "ValidateInput(false)” setzen. Unter ASP.NET 4 muss man noch eine Kleinigkeit beachten
Szenario:
Simples Input Feld:
<% using(Html.BeginForm()) { %> <%:Html.TextBox("HtmlInput", ViewData["HtmlInput"]) %> <%}%>
Nix besonderes im Controller, außer dass die Post - Index Methode mit ValidateInput (false) dekoriert wurde:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace MvcRequestValidation.Controllers { [HandleError] public class HomeController : Controller { [AcceptVerbs(HttpVerbs.Get)] public ActionResult Index() { ViewData["Message"] = "Welcome to ASP.NET MVC!"; return View(); } [ValidateInput(false)] [AcceptVerbs(HttpVerbs.Post)] public ActionResult Index(string htmlInput) { ViewData["Message"] = "Welcome to ASP.NET MVC!"; ViewData["HtmlInput"] = htmlInput; return View(); } public ActionResult About() { return View(); } } }
Das ganze läuft unter .NET 4.0.
Und nun? Trotzdem Fehlermeldung...
Lösung des Problems: (Steht sogar in der Description)
To allow pages to override application request validation settings, set the requestValidationMode attribute in the httpRuntime configuration section to requestValidationMode="2.0". Example: <httpRuntime requestValidationMode="2.0" />.
Wer liest schon Fehlermeldungen? ;) Zum Glück war ich nicht der einzige mit dem Problem ;)
Ist auch als Breaking Change in den Dokumentationen von Microsoft zu finden. Unter <system.web> noch "<httpRuntime requestValidationMode="2.0" />” einfügen und fertig :)