122

ASP.net MVCを使用して、ユーザーが特定のフィールドにHTMLを入力できるようにするにはどうすればよいですか。

コントローラ内のこの複雑なオブジェクトにマップされる多くのフィールドを持つ長いフォームがあります。

1つのフィールド(説明)でHTMLを許可し、後で自分の衛生状態を実行できるようにします。

4

11 に答える 11

165

次の属性を、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;}
 }
于 2010-09-01T19:11:11.760 に答える
131

[AllowHtml]プロパティの上の属性はどうですか?

于 2012-07-30T12:17:20.357 に答える
42

モデルに追加:

using System.Web.Mvc;

そしてあなたの財産に

        [AllowHtml]
        [Display(Name = "Body")]
        public String Body { get; set; }

私の観点からすると、このコードはこのエラーを回避する最善の方法です。HTMLエディターを使用している場合は、すでに制限されているため、セキュリティの問題は発生しません。

于 2013-03-24T21:05:23.197 に答える
9

セキュリティレベルを下げることを提案するブログやコメントがたくさんあるので、特定のプロパティを追加する[AllowHtml]ことをお勧めします。これは受け入れられないはずです。

これを追加することで、MVCフレームワークにより、コントローラーがヒットし、そのコントローラー内のコードが実行されるようになります。

ただし、コードやフィルターなどによって、応答がどのように生成されるか、および別の同様のエラーをトリガーする可能性のある検証がさらにあるかどうかによって異なります。

いずれにせよ、[AllowHtml]属性を追加することは、HTMLをコントローラーで逆シリアル化できるため、正しい答えです。ビューモデルの例:

[AllowHtml]
public string MessageWithHtml {get; set;}
于 2015-05-06T22:19:02.650 に答える
8

[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)
{
  ...
于 2015-11-24T09:48:08.670 に答える
3

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/

于 2018-06-11T11:27:44.570 に答える
3

データをURLエンコードすることも私にとってはうまくいきます

例えば

var data='<b>こんにちは</b>'

ブラウザで、投稿する前にencodeURIComponent(data)を呼び出します

サーバーでHttpUtility.UrlDecode(received_data)を呼び出してデコードします

そうすれば、どのフィールド領域にhtmlを許可するかを正確に制御できます。

于 2018-08-20T23:57:52.297 に答える
1

NopCommerceを使用したEコマースサイトの開発中にこの問題に直面しました。以前の回答と同様に、3つの異なる方法でこのソリューションを取得しました。しかし、NopCommerceの構造によると、一度に3つは見つかりませんでした。私はちょうど彼らがちょうど使用している[AllowHtml]のを見ました、そしてそれはどんな問題も除いてうまく働いています。以前に尋ねられた質問のように

個人的には[ValidateInput(false)]、モデルエンティティの合計チェックをスキップしているため、安全ではありません。しかし、誰かが書くだけならここを見てください

[AllowHtml] 
public string BlogText {get;set;}

次に、単一のプロパティのみをスキップし、特定のプロパティのみを許可し、他のすべてのエンティティをほとんどチェックしません。したがって、それは私の方が好ましいようです。

于 2017-01-12T06:45:39.390 に答える
1

私の場合、OutputCacheアクションフィルターと組み合わせたときにAllowHtml属性が機能していませんでした。この答えは私にとって問題を解決しました。これが誰かを助けることを願っています。

于 2017-02-17T21:32:36.143 に答える
1

[AllowHtml]たとえば、プロジェクトに使用できます

 [AllowHtml]
 public string Description { get; set; }

このコードを使用してライブラリをクラス化するには、このパッケージをインストールします

Install-Package Microsoft.AspNet.Mvc

これを使用した後using

using System.Web.Mvc;
于 2019-12-02T12:34:00.133 に答える
0

残念ながら、ここでの答えはどれもうまくいきませんでした。

最終的にカスタムモデルバインディングを使用し、サードパーティのサニタイザーを使用しました。

ここで私の自己回答の質問を参照してください。

于 2019-12-26T02:35:25.233 に答える