2010-12-01 7 views
0

J'ai un modèle de commentaire avec propriété de chaîne comme ceci:Comment stocker le code HTML dans ASP.NET MVC2 Modèle

[Column] 
public string Text { get; set; } 

texte Commentaire peut avoir toutes les balises HTML à l'intérieur (je sais qu'il est mauvais, mais je dois). Mais quand je mets à jour l'objet, MVC 2 échappe tous les balises HTML.

méthode de mise à jour est:

[HttpPost] 
public ActionResult Edit(int ID=0) 
{ 
     Comment comment= ID == 0 
      ? new Comment() 
      : commentRepository.Comments.First(x => x.ID == ID); 

     TryUpdateModel(comment); 

     if (ModelState.IsValid) 
     { 
      commentRepository.Save(comment); 
      return RedirectToAction("View/" + comment.ID); 
     } 
     else 
     { 
      return View(comment); 
     } 
    } 

Comment puis-je mettre à jour le texte de commentaire sans échapper?

P.S. J'ai aussi problème avec le type de colonne: lorsque je passe la colonne Texte dans SQL Server Express de varchar-texte, modèle de mise à jour échoue:

Le texte des types de données et nvarchar sont incompatibles dans l'opérateur Egal à.

Détails d'exception: System.Data.SqlClient.SqlException: Les types de données text et nvarchar sont incompatibles dans l'opérateur égal à.

Répondre

2

Ce que vous avez à faire est de désactiver la validation pour ce champ de saisie particulier. Pour ce faire, vous pouvez ajouter ce filtre pour vous l'action:

[ValidateInput(false)] 

Ou si vous voulez être précis et ne désactivez-ce un champ (peut-être cela fonctionnera sur plusieurs, je ne l'ai pas testé que si) faites quelque chose comme ceci:

[ValidateInput(true, Exclude = "YourFieldName")] 

Ceci exclura votre champ mais vérifiera tous les autres champs. ADDON: Ajout de filtres ca peut être fait dans (AFAIK) dans les deux sens. Voici 2 exemples:

[HttpPost, ValidateInput(true, Exclude = "YourFieldName")] 
public ActionResult SomeAction(...) { ... } 

[HttpPost] 
[ValidateInput(true, Exclude = "YourFieldName")] 
publiv ActionResult SomeAction(...) { ... } 
+0

Merci, cela fonctionne maintenant, mais il n'y a pas de propriété Ne comptez pas dans ValidationInputAttribute, donc j'ai besoin pour me valider. Mais c'est bon :) – Shart

+0

D'ailleurs, j'ai trouvé que mon ckeditor renvoyait du code html échappé, donc dans l'action du contrôleur j'ai déjà échappé html. Pour avoir du HTML brut, je devrais mettre 'htmlEncodeOutput = false' dans la configuration de ckeditor. Mais j'ai dû désactiver la validation aussi. – Shart

+0

1) C'est probablement nouveau dans MVC3. 2) Vous pouvez essayer le Server.HtmlDecode (html) ;. – gligoran

2

Vous devez ajouter le filtre ci-dessous sur votre contrôleur sous le filtre [HttpPost];

[ValidateInput(false)] 
1
  • Ne pas utiliser le type de texte dans SQL Server, il est dépréciée. Au lieu de cela, utilisez Nvarchar (MAX).
  • Pour désactiver la validation d'entrée pour votre action, vous devez utiliser l'attribut ValidateInput de votre méthode d'action. Si vous utilisez .net 4 vous devez ajouter une ligne à votre web.config:
<configuration> 
    <system.web> 
     <httpRuntime requestValidationMode="2.0"/> 
+0

Merci. Je ne savais pas que le texte était obsolète. Bon à savoir) – Shart

Questions connexes