El tutorial o código que hallarás en este artículo es la resolución más eficiente y efectiva que encontramos a tu duda o problema.
Solución:
Tienes pocas opciones.
En el modelo agrega esto attribute a cada propiedad que necesita para permitir HTML – mejor elección
using System.Web.Mvc;
[AllowHtml]
public string SomeProperty get; set;
En la acción del controlador, agregue esto attribute para permitir todo HTML
[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
Fuerza bruta en web.config – definitivamente no recomendado
En el archivo web.config, dentro de las etiquetas, inserte el elemento httpRuntime con el attribute requestValidationMode=”2.0″. También agregue la solicitud de validación=”false” attribute en el elemento de páginas.
Más información: http://davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx
Lo anterior funciona para los usos del modelbinder predeterminado.
Carpeta de modelos personalizada
Parece que una llamada a bindingContext.ValueProvider.GetValue() en el código anterior siempre valida los datos, independientemente de cualquier attributes. Indagar en las fuentes de ASP.NET MVC revela que DefaultModelBinder primero verifica si se requiere la validación de la solicitud y luego llama al método bindingContext.UnvalidatedValueProvider.GetValue() con un parámetro que indica si se requiere o no la validación.
Desafortunadamente, no podemos usar ningún código del marco porque está sellado, es privado o lo que sea para proteger a los desarrolladores ignorantes de hacer cosas peligrosas, pero no es demasiado difícil crear un archivador de modelo personalizado que funcione y respete AllowHtml y ValidateInput. attributes:
public class MyModelBinder: IModelBinder
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
// First check if request validation is required
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;
// Get value
var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
if (valueProviderResult != null)
var theValue = valueProviderResult.AttemptedValue;
// etc...
La otra pieza requerida es una forma de recuperar un valor no validado. En este ejemplo, usamos un método de extensión para la clase ModelBindingContext:
public static class ExtensionHelpers
public static ValueProviderResult GetValueFromValueProvider(this ModelBindingContext bindingContext, bool performRequestValidation)
var unvalidatedValueProvider = bindingContext.ValueProvider as IUnvalidatedValueProvider;
return (unvalidatedValueProvider != null)
? unvalidatedValueProvider.GetValue(bindingContext.ModelName, !performRequestValidation)
: bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
Más información sobre esto en http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/
Probar:
HttpRequestBase request = controllerContext.HttpContext.Request;
string re = request.Unvalidated.Form.Get("ConfirmationMessage")
Ampliando la respuesta de @DW, en mi controlador de edición, al iterar sobre los valores del formulario, tuve que reemplazar todas las instancias de Request.Params.AllKeys
con Request.Unvalidated.Form.AllKeys
y todas las instancias de Request[key]
con Request.Unvalidated.Form[key]
.
Esta fue la única solución que funcionó para mí.
Te mostramos las comentarios y valoraciones de los lectores
Más adelante puedes encontrar las interpretaciones de otros programadores, tú incluso tienes la habilidad mostrar el tuyo si dominas el tema.