Estamos tratando de utilizar la decoración [AllowHtml] en una de nuestras propiedades ViewModel para que podamos evitar la YSOD:AllowHtml que no trabaja para ASP.Net MVC 3 sitio
Un Request.Form potencialmente peligrosos el valor se detectó desde el cliente (RequestText =
"<br>"
).
cuando intentamos enviar texto html, como: <br>
. Queremos utilizar Server.HtmlEncode dentro de la acción del controlador para evitar ataques, pero cuando decoramos la propiedad con [AllowHtml]
no tiene ningún efecto, y si tratamos de usar [ValidateInput(false)]
en la acción del controlador, tampoco tiene efecto. Vimos un StackOverflow Post diciendo que en MVC 3 RC2 que hay que añadir:
ModelMetadataProviders.Current = new DataAnnotationsModelMetadataProvider(); para global.asax
Lo intentamos también, aunque estamos utilizando la versión de lanzamiento de MVC 3, no RC2, pero eso tampoco tuvo ningún efecto. ¿Alguien sabe cómo arreglar esto?
Modelo:
namespace UI.Models.ViewModel
{
public class CustomerRequestSupport
{
/// <summary>
/// Gets or Sets the textual description entered by the Customer for
/// the support requested.
/// </summary>
[AllowHtml]
public string RequestText { get; set; }
}
}
controlador:
[HttpPost]
[TabsActionFilter]
public ActionResult RequestSupport(CustomerRequestSupport collection)
{
if (ModelState.IsValid)
{
Ticket ticket = new Ticket();
ticket.Requestor = LoggedInCustomer;
ticket.Summary = "General Support Ticket";
ticket.Notes = Server.HtmlEncode(collection.RequestText);
var errors = _ticketService.SubmitTicket(ticket);
if (errors.Any())
{
ModelState.AddModelError("collection",
String.Format("An error has occurred in your Request for Support: " +
"{0} Please try again later or call the help desk " +
"for immediate assistance.",
errors.Aggregate((acc, st) => acc + " " + st)));
}
else
{
TempData["FlashMessage"] = String.Format("Your request for support has been " +
"submitted, the Ticket Number is: {0}.", ticket.TicketNumber);
return AutoMapView<CustomerDetails>(View("Details", base.LoggedInCustomer));
}
}
//needed for tabs to show
ViewData.CustomerContactSet(base.LoggedInCustomer);
return View();
Vista:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<UI.Models.ViewModel.CustomerRequestSupport>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Request Support
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="PageTitle" runat="server">
Request Support
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
<% using (Html.BeginForm())
{ %>
<%= Html.ValidationSummary() %>
<h2>Enter a description of the support needed</h2>
<%: Html.TextAreaFor(m => m.RequestText, 4, 90, null) %>
<input type="submit" value="Submit" />
<% } %>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="JavaScriptContent" runat="server">
</asp:Content>
resulta que estábamos usando la versión 0.81 de Glimpse, y cuando actualizamos a la versión de lanzamiento actual, ahora está funcionando bien. –