Contenido HTML dinámico: "Se detectó un valor de Request.Form potencialmente peligroso del cliente"

Estoy usando MVC 3 y Razor.

Tengo una página donde puedes crear un proveedor. En el front-end, la página de un proveedor tiene 3 cosas: un nombre, una descripción (HTML) y varias pestañas que contienen HTML. Mi cliente quiere que las pestañas sean dinámicas, quieren poder agregar / editar / eliminar pestañas y contenido cuando agregan un proveedor.

Así que aquí está el diseño de mi base de datos:

Vendors
-------------------
VendorID (PK)
Name
Description

VendorTabs
-------------------
VendorTabID (PK)
VendorID (FK)
Title
Content

Aquí está mi modelo de vista:

public class VendorViewModel
{
    [ScaffoldColumn(false)]
    public int VendorId { get; set; }

    public string Name { get; set; }

    [AllowHtml]
    public string Description { get; set; }
}

Y mi método de publicación del controlador:

[HttpPost]
public ActionResult Create(VendorViewModel viewModel, string[] tabTitles, string[] tabContent)
{
    var vendor = new Vendor();
    vendor.Name = viewModel.Name;
    vendor.Description = viewModel.Description;

    if (ModelState.IsValid)
    {
        for (int i = 0; i < tabTitles.Length; i++)
        {
            vendor.VendorTabs.Add(new VendorTab
            {
                VendorID = vendor.VendorID,
                Title = tabTitles[i],
                Content = tabContent[0]
            });
        }

        _vendorsRepository.SaveVendor(vendor);

        return RedirectToAction("Index");
    }

    return View(viewModel);     // validation error, so redisplay same view
}

En mi opinión, tengo la funcionalidad para agregar / eliminar campos dinámicamente para un título de pestaña y una descripción de pestaña. Se pasan al controlador a través de las matrices. tabTitles y tabContent. Pero cuando publico el formulario con HTML en el contenido de la pestaña dinámica, aparece el siguiente error:

Se detectó un valor de Request.Form potencialmente peligroso del cliente

Me encontré con este problema antes, con el campo Descripción para mi proveedor. Después de investigar un poco, vi que puedo agregar el AllowHtml anotación.

¿Cómo puedo aplicar la misma funcionalidad a mi contenido dinámico?

preguntado el 28 de agosto de 11 a las 03:08

2 Respuestas

en lugar de matrices tabTitle y tabContent, estructura tu modelo de vista de manera que puedas poner el AllowHtmlAttribute en cada propiedad individual que podría incluir contenido del usuario, y luego solo incluya una Lista de estos en el Modelo al que está vinculando la Vista

public class TabViewModel
{
    [AllowHtml]
    public string Title { get; set; }

    [AllowHtml]
    public string Content { get; set; }
}

Respondido 28 ago 11, 07:08

Está bien, entonces tengo IEnumerable<TabViewModel> Tabs como propiedad de VendorViewModel ahora. Si no estoy usando las matrices tabTitle y tabContent, ¿cómo puedo asociar mi contenido dinámico con Tabs? - Steven

decir ah. Agregué una respuesta y me di cuenta de que básicamente era exactamente la misma que la tuya (no me gusta leer otras antes que la mía para asegurarme de que la mía es original) +1:) - Adam Tuliper - MSFT

Cree una propiedad en su TabViewModel específicamente para estas listas como dijo qntmfred para que no dependa del enlace dinámico; de lo contrario, creo que necesita ValidateRequest (falso) que no se recomienda en general. - Adam Tuliper - MSFT

Los campos deben denominarse como Tabs [0] .Title, etc. La propiedad Tabs probablemente debería ser del tipo TabViewModel []. - gran

¿Qué tal si hacemos [AllowHtml] string [] TabContent {get; set;} una propiedad del modelo?

Respondido 28 ago 11, 16:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.