Por ejemplo, un usuario crea una nueva pregunta en un foro.

Envío ajax al servidor, luego uso HtmlEncode para excluir el código HTML antes de guardarlo en la base de datos.

¿Es posible que HtmlEncode se use automáticamente al recibir una solicitud?

Además, al usar el atributo (por ejemplo, [HtmlAllowed]) puede permitir el código html en la solicitud.

Gracias

0
Alexander Grek 19 feb. 2020 a las 12:12

2 respuestas

La mejor respuesta

Gracias a pwrigshihanomoronimo, por señalarme en la dirección correcta.

Este ModelBinder codifica automáticamente todas las propiedades de cadena, excepto que tiene el atributo [SafeHtml]

public class SafeStringModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        HttpRequestBase request = controllerContext.HttpContext.Request;
        string name = bindingContext.ModelName;
        string value = request.Unvalidated[name];

        Type holderType = bindingContext.ModelMetadata.ContainerType;
        if (holderType != null)
        {
            PropertyInfo propertyType = holderType.GetProperty(bindingContext.ModelMetadata.PropertyName);
            if (propertyType == null) return value;

            object[] attributes = propertyType.GetCustomAttributes(true);
            bool hasAttribute = attributes.Cast<Attribute>().Any(a => a.GetType() == typeof (SafeHtmlAttribute));

            if (!hasAttribute && !string.IsNullOrEmpty(value))
            {
                value = HttpUtility.HtmlEncode(value);
            }
        }

        return value;
    }
}

[AttributeUsage(AttributeTargets.Property)]
public class SafeHtmlAttribute : Attribute { }
0
Alexander Grek 20 feb. 2020 a las 19:02

Puede lograrlo usando el enlazador de modelos personalizados, cada propiedad de cadena o parámetro de cadena pasará por este método cuando ASP.NET intente vincular la solicitud a los parámetros del método de acción

public class StringBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        bindingContext.ModelState.SetModelValue(bindingContext.ModelName, value);

        var str = (string)value?.ConvertTo(typeof(string));

        str = HttpUtility.HtmlEncode(str);
        return str;
    }
}

Y en Application_Start()

ModelBinders.Binders.Add(typeof(string), new StringBinder());
0
Yegor Androsov 19 feb. 2020 a las 09:43