2011-01-22 12 views
6

La pregunta es muy simple:MVC ASP.NET MVC3 AllowHtml ¿Atributo no funciona?

Digamos que tiene un modelo llamado Persona

public class Person 
{ 

     public int PersonID {get; set;} 

     public string Name {get; set;} 

     [AllowHtml] // Allow html in Intro property 
     public string Intro {get; set;} 

     [ScaffoldColumn(false)] 
     public string ComplicatedValue {get; set;} 

} 

En el controlador de Crear acción

[HttpPost] 
public ActionResult Create(Person o, FormCollection collection) 
{ 

// whatever code here; 

} 

Si lo ejecuta,

  1. entrada de llanura texto para Intro, no ocurre el problema .
  2. entrada de contenido HTML de introducción, no importa cómo haya configurado su archivo de configuración, se dice "un potencial peligroso ..."

HAGO encontrar la razón de este problema.

Si cambia la función de

public ActionResult Create(Person o) // Get rid of the *FormCollection collection* 
{ 

// whatever code here; 

} 

Esto eliminará el "potencial peligroso" error.

Pero mi problema es que para mi aplicación, tengo que usar el secundario parámetro colección FormCollection en el método Crear acción, porque tengo que usar algunos otros valores de control y variable de servidor para asignar un valor calculado a la propiedad ComplicatedValue.

Si cualquier experto de ASP.NET MVC3 ha encontrado el mismo problema que yo y ha encontrado una solución, hágamelo saber.

Respuesta

0

has necesitado

[bind (Excluir = "ComplicatedValue")]

:

[HttpPost] 
public ActionResult Create([Bind(Exclude="ComplicatedValue")]Person o) 
{ 
} 

?

con que le permite excluir el establecimiento ComplicatedValue propiedad en la forma y todavía envía el objeto como un clase persona.

esperanza de que ayuda a

+0

realidad que excluye la propiedad o.ComplicatedValue pero permanece en FormCollection así que todavía se activará el error. – Shenaniganz

2

podría sugerir el uso de un aglutinante de modelo personalizado en lugar de tirar los datos complejos de una FormCollection. Scott Hanselman tiene una publicación de blog sobre cómo crear una carpeta de modelo personalizada que sirva como una buena plantilla. En su publicación, reúne un DateTimeModelBinder que permite que una propiedad DateTime sea configurada por una sola entrada que contenga la fecha o un par de entradas que contengan una fecha y una hora.

6

Este foro en este enlace trata este tema detenidamente y ofrece algunas soluciones.

http://forums.asp.net/p/1621677/4161637.aspx

Aquí es una solución de ese hilo que puede o no puede trabajar para usted:

public ActionResult Create(Person o) // Get rid of the *FormCollection collection* 
{  
FormCollection form = new FormCollection(Request.Unvalidated().Form); 
// whatever code here; 
} 

o mi propia recomendación:

public ActionResult Create(Person o, int otherControlValue1, int otherControlValue2, ...) 
{   
     o.ComplicatedValue = CalculateComplicatedValue(otherControlValue1, otherControlValue2, ...); 
     // whatever code here. 

} 

En mi caso, soy No usé FormCollection, pero estaba allí, así que tuve una huella diferente en mi método [HttpPost]. Hice este corte y poner en un parámetro falso:

public virtual ActionResult Edit(int id) 
{ 
    return View(this.repository.GetById(id)); 
} 
[HttpPost] 
public virtual ActionResult Edit(int id, int? bogusID) 
{    
    var d = repository.GetById(id); 
    if (TryUpdateModel(d)) 
    { 
     repository.Save(); 
     return RedirectToAction("Index"); 
    } 
    return View(); 
} 
+0

La respuesta nos ha ayudado a resolver el problema. ¡Muchas gracias! –

+0

El ejemplo superior funcionó para mí, excepto que tuve que eliminar el '()' extra de 'Request.Unvalidated(). Form' para simplemente tener' Request.Unvalidated.Form' – chadiusvt

+0

En lugar del parámetro falso, simplemente realice una función diferente nombre (por ejemplo, Update (int id)), y marque con el atributo ActionName ("Edit"). – Ted

Cuestiones relacionadas