回答:
HTMLを許可するコントローラーに次の属性アクション(投稿)を追加します。
[ValidateInput(false)]
編集: 1としてCharlinoのコメント:
web.configで、使用する検証モードを設定します。MSDNを参照してください。
<httpRuntime requestValidationMode="2.0" />
2014年9月を編集:sprinter252コメントに従って:
ここで[AllowHtml]
属性を使用する必要があります。MSDNから以下を参照してください。
ASP.NET MVC 3アプリケーションの場合、HTMLをモデルにポストバックする必要がある場合、ValidateInput(false)を使用してリクエストの検証をオフにしないでください。次のように、[AllowHtml]をモデルプロパティに追加するだけです。
public class BlogEntry { public int UserId {get;set;} [AllowHtml] public string BlogText {get;set;} }
<httpRuntime requestValidationMode="2.0" />
は、web.configファイルでも設定する必要があります。
[AllowHtml]
プロパティの上の属性はどうですか?
MetadataTypeAttribute
は、オブジェクト全体ではなく個々のフィールドでのみHTMLを許可するため、問題なく機能し、望ましい方法です。
モデルに追加:
using System.Web.Mvc;
そしてあなたの財産に
[AllowHtml]
[Display(Name = "Body")]
public String Body { get; set; }
私のポイントからのこのコードは、このエラーを回避する最良の方法です。HTMLエディターを使用している場合、既に制限されているため、セキュリティ上の問題はありません。
追加 [AllowHtml]
特定のプロパティをすることは、許容できないセキュリティレベルを下げることを提案するブログやコメントがたくさんあるため、推奨されるソリューションです。
これを追加することで、MVCフレームワークはコントローラーにヒットし、そのコントローラーのコードを実行できるようにします。
ただし、コードやフィルターなど、応答の生成方法と、別の同様のエラーをトリガーする可能性のある検証があるかどうかによって異なります。
いずれにせよ、[AllowHtml]
htmlをコントローラーで逆シリアル化できるため、属性を追加することが正しい答えです。あなたのviewmodelの例:
[AllowHtml]
public string MessageWithHtml {get; set;}
[System.Web.Mvc.AllowHtml]
いくつかの回答で説明されているように、関連するプロパティに追加しましたが、同じ問題に直面しました。
私の場合、MVC検証が行われる前にUnhandledExceptionFilter
Requestオブジェクトにアクセスするクラスがあり(したがって、AllowHtmlは無効です)、このアクセスによりが発生し[HttpRequestValidationException] A potentially dangerous Request.Form value was detected from the client
ます。
つまり、Requestオブジェクトの特定のプロパティにアクセスすると、暗黙的に検証が発生します(私の場合はそのParams
プロパティです)。
リクエスト内の特定のフィールド(たとえば、入力要素やクエリ文字列値)のリクエスト検証を無効にするには、次の例に示すように、アイテムを取得するときにRequest.Unvalidatedメソッドを呼び出します。
したがって、このようなコードがある場合
var lParams = aRequestContext.HttpContext.Request.Params;
if (lParams.Count > 0)
{
...
に変更
var lUnvalidatedRequest = aRequestContext.HttpContext.Request.Unvalidated;
var lForm = lUnvalidatedRequest.Form;
if (lForm.Count > 0)
{
...
または、Form
検証を実行していないように見えるプロパティを使用する
var lForm = aRequestContext.HttpContext.Request.Form;
if (lForm.Count > 0)
{
...
(「モデルプロパティ」ではなく)アクションメソッドパラメーターの HTML入力を許可する必要がある場合、組み込みの方法はありませんが、カスタムモデルバインダーを使用して簡単にこれを実現できます。
public ActionResult AddBlogPost(int userId,
[ModelBinder(typeof(AllowHtmlBinder))] string htmlBody)
{
//...
}
AllowHtmlBinderコード:
public class AllowHtmlBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var request = controllerContext.HttpContext.Request;
var name = bindingContext.ModelName;
return request.Unvalidated[name]; //magic happens here
}
}
私のブログ投稿で完全なソースコードと説明を見つけてください:https : //www.jitbit.com/alexblog/273-aspnet-mvc-allowing-html-for-particular-action-parameters/
私はNopCommerceを使用したeコマースサイトの開発中にこの問題に直面しました。以前の回答と同様に、3つの異なる方法でこのソリューションを得ました。しかし、NopCommerceの構造によれば、これら3つは一度に見つかりませんでした。私はちょうど彼らがちょうど[AllowHtml]
それを使用しているところを見ただけであり、それはどんな問題を除いてうまく機能しています。以前に質問されたとおり
個人的には[ValidateInput(false)]
、モデルエンティティ全体のチェックをスキップしているので、これは安全ではありません。しかし、誰かがここに書いたら、ここを見てください
[AllowHtml]
public string BlogText {get;set;}
次に、単一のプロパティのみをスキップし、特定のプロパティのみを許可して、他のすべてのエンティティをほとんどチェックしません。したがって、私の方が望ましいようです。