2012-01-10 9 views
5

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> 

Respuesta

2

En su answer Darin es, sin duda en algo cuando le pide

Así que tienes que estar haciendo algo diferente a lo que he mostrado aquí. ¿Qué es?

Te estoy adivinando tienen otra cosa que afecta a la canalización de ASP.NET que tiene acceso el FormCollection antes de su [AllowHtml] ser tenido en cuenta. En la parte superior de mi cabeza algunas bibliotecas ASP.NET MVC OSS comunes que tocan la tubería son ELMAH, Glimpse, WebActivator, MvcContrib, hay muchas más pero se entiende la idea.

Tengo que creer que estás usando una de las herramientas anteriores o algo similar.Suponiendo que está seguro de que está en la última versión de cada uno y verifique sus informes de errores abiertos.

Finalmente, una forma rápida de determinar si es su código, su instancia de MVC o una biblioteca de OSS sería crear un proyecto de prueba. Intenta crear un proyecto vainilla ASP.NET MVC. Asegúrese de que AllowHtml funcione. Luego agregue sus diversos componentes OSS hasta que se rompa. Solo asegúrese de agregar componentes OSS para que las versiones coincidan con lo que está utilizando en su proyecto actual.

+0

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

7

Tienes que estar haciendo algo mal. Lamentablemente, como no ha mostrado su ejemplo, no podemos saber qué está haciendo mal. Así que voy a escribir un ejemplo de trabajo completo:

Modelo:

public class MyViewModel 
{ 
    [AllowHtml] 
    public string RequestText { get; set; } 
} 

controlador:

public class HomeController: Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel 
     { 
      RequestText = "<strong>Hello World</strong>"; 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     return View(model); 
    } 
} 

Vista:

@model MyViewModel 
@using (Html.BeginForm()) 
{ 
    @Html.TextAreaFor(x => x.RequestText) 
    <button type="submit">OK</button> 
} 

Así que tienes que estar haciendo algo diferente a lo Mostré aquí. ¿Qué es?

+0

Darin - Gracias por el mensaje, he agregado el código anterior. Estamos haciendo algunas cosas adicionales en el código, pero creo que está siguiendo el mismo modelo básico que usted describió para mí. No veo ninguna razón por la cual el código que presenté anteriormente no funcionará. –

+0

@RussClark, no puede ver nada incorrecto con su código. Si puede enviarme un ejemplo de proyecto VS que ilustre el problema, estaría más que feliz de echarle un vistazo y tratar de ayudarlo. –

+0

@DarinDimitrov gracias por su sugerencia, provocó mi respuesta (http://stackoverflow.com/a/8838807/61654) que parece haber solucionado el problema. – ahsteele