2010-12-01 46 views
0

我有一個字符串屬性這樣的評論模式:如何存儲HTML代碼在ASP.NET MVC2模式

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

註釋文本可以有內部的所有HTML標籤(我知道這是不好的,但我必須)。但是,當我更新對象,MVC 2轉義所有的HTML標籤。

更新方法:

[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); 
     } 
    } 

我怎麼能不逃逸更新註釋文本?

P.S.我也有與列類型的問題:當我在SQL Server Express從VARCHAR切換欄文本文本,更新模型失敗:

數據類型的文本和nvarchar是等於運算符不兼容。

異常詳細信息:System.Data.SqlClient.SqlException:數據類型text和nvarchar在等於運算符中不兼容。

回答

2

你所要做的就是關閉對特定輸入字段的驗證。要做到這一點,你可以將此篩選器添加到您的行動:

[ValidateInput(false)] 

或者,如果你想成爲特殊,只關閉它在一個領域(也許它會在多工作,我沒有測試過,雖然)做這樣的事情:

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

這將排除你的領域,但仍然檢查所有其他領域。

附加:添加濾鏡可以用(AFAIK)兩種方式完成。這裏有2個樣品:

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

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

謝謝你,現在的工作,但沒有財產ValidationInputAttribute排除,所以我需要驗證我自己。但沒關係:) – Shart 2010-12-01 16:03:28

+0

順便說一句,我發現我的ckeditor返回轉義html代碼,所以在控制器的行動中,我已經得到了逃脫的HTML。要有原始的html我應該把`htmlEncodeOutput = false`放在ckeditor的配置中。但我也必須禁用驗證。 – Shart 2010-12-01 16:08:55

2

您需要在控制器下面的[HttpPost]過濾器中添加下面的過濾器;

[ValidateInput(false)] 
1
  • 不要使用SQL Server中的文本數據類型,它的棄用。而是使用Nvarchar(MAX)。
  • 要關閉您的操作的輸入驗證,您必須在操作方法上使用ValidateInput屬性。如果使用.NET 4,你有一個多行添加到您的web.config:
<configuration> 
    <system.web> 
     <httpRuntime requestValidationMode="2.0"/>