ASP.net MVCを使用して、ユーザーが特定のフィールドにHTMLを入力できるようにするにはどうすればよいですか。
コントローラ内のこの複雑なオブジェクトにマップされる多くのフィールドを持つ長いフォームがあります。
1つのフィールド(説明)でHTMLを許可し、後で自分の衛生状態を実行できるようにします。
ASP.net MVCを使用して、ユーザーが特定のフィールドにHTMLを入力できるようにするにはどうすればよいですか。
コントローラ内のこの複雑なオブジェクトにマップされる多くのフィールドを持つ長いフォームがあります。
1つのフィールド(説明)でHTMLを許可し、後で自分の衛生状態を実行できるようにします。
次の属性を、HTMLを許可するコントローラーのアクション(投稿)に追加します。
[ValidateInput(false)]
編集: 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;} }
[AllowHtml]
プロパティの上の属性はどうですか?
モデルに追加:
using System.Web.Mvc;
そしてあなたの財産に
[AllowHtml]
[Display(Name = "Body")]
public String Body { get; set; }
私の観点からすると、このコードはこのエラーを回避する最善の方法です。HTMLエディターを使用している場合は、すでに制限されているため、セキュリティの問題は発生しません。
セキュリティレベルを下げることを提案するブログやコメントがたくさんあるので、特定のプロパティを追加する[AllowHtml]
ことをお勧めします。これは受け入れられないはずです。
これを追加することで、MVCフレームワークにより、コントローラーがヒットし、そのコントローラー内のコードが実行されるようになります。
ただし、コードやフィルターなどによって、応答がどのように生成されるか、および別の同様のエラーをトリガーする可能性のある検証がさらにあるかどうかによって異なります。
いずれにせよ、[AllowHtml]
属性を追加することは、HTMLをコントローラーで逆シリアル化できるため、正しい答えです。ビューモデルの例:
[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
プロパティ)。
検証を防ぐための解決策は、MSDNに文書化されています
次の例に示すように、リクエストの特定のフィールド(たとえば、入力要素やクエリ文字列値)のリクエスト検証を無効にするには、アイテムを取得するときに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)
{
...
action-methodパラメーター(「modelproperty」ではなく)の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/
データをURLエンコードすることも私にとってはうまくいきます
例えば
var data='<b>こんにちは</b>'
ブラウザで、投稿する前にencodeURIComponent(data)を呼び出します
サーバーでHttpUtility.UrlDecode(received_data)を呼び出してデコードします
そうすれば、どのフィールド領域にhtmlを許可するかを正確に制御できます。
NopCommerceを使用したEコマースサイトの開発中にこの問題に直面しました。以前の回答と同様に、3つの異なる方法でこのソリューションを取得しました。しかし、NopCommerceの構造によると、一度に3つは見つかりませんでした。私はちょうど彼らがちょうど使用している[AllowHtml]
のを見ました、そしてそれはどんな問題も除いてうまく働いています。以前に尋ねられた質問のように
個人的には[ValidateInput(false)]
、モデルエンティティの合計チェックをスキップしているため、安全ではありません。しかし、誰かが書くだけならここを見てください
[AllowHtml]
public string BlogText {get;set;}
次に、単一のプロパティのみをスキップし、特定のプロパティのみを許可し、他のすべてのエンティティをほとんどチェックしません。したがって、それは私の方が好ましいようです。
私の場合、OutputCacheアクションフィルターと組み合わせたときにAllowHtml属性が機能していませんでした。この答えは私にとって問題を解決しました。これが誰かを助けることを願っています。
[AllowHtml]
たとえば、プロジェクトに使用できます
[AllowHtml]
public string Description { get; set; }
このコードを使用してライブラリをクラス化するには、このパッケージをインストールします
Install-Package Microsoft.AspNet.Mvc
これを使用した後using
using System.Web.Mvc;