Webフォームを使用して作成したアプリケーションを、vb.netを使用してasp.net mvcフレームワークに変換しています。私の見解の1つに問題があります。フォームを送信すると、「クライアントから、潜在的に危険なRequest.Form値が検出されました」という黄色の死の画面が表示されます。私はtinymceをRTEとして使用しています。ビュー自体を設定しました
ValidateRequest = "false"
MVCでは、これまでに読んだことから、それを尊重しないことは知っています。だから私はそれをコントローラーアクションにも入れました。私はさまざまな設定を試しました:
<ValidateInput(False), AcceptVerbs(HttpVerbs.Post)> _
...そして...
<AcceptVerbs(HttpVerbs.Post), ValidateInput(False)> _
...そしてこのように...
<ValidateInput(False)> _
<AcceptVerbs(HttpVerbs.Post)> _
それが違いを生んだかどうかを見るためだけに、まだ死の黄色の画面が表示されます。このビューと、自分の投稿が関係するコントローラーの特定のアクションに対してのみ設定します。何か不足していますか?
ポストされているコントローラーアクションが、あなたが属性を持っているものであることを確信していますか?
Asp.net 4では、web.configでも検証モードを構成する必要があります。
以下を<system.web>
要素の子として設定します。
<system.Web>
...
<httpRuntime requestValidationMode="2.0"/>
Asp.Net 4は、デフォルトでrequestValidationModeを4.0
に設定します。これは、HTTPリクエストのBeginRequstフェーズの前にリクエストの検証を実行するようにシステムに指示します。検証は、システムがアクション属性に到達してリクエストを検証しないように指示する前に行われるため、属性は使用できなくなります。 requestValidationMode = "2.0"を設定すると、asp.net 2.0リクエスト検証動作に戻り、ValidateInput
属性が期待どおりに機能するようになります。
IModelBinderインターフェイスを実装する独自のモデルバインダーを使用している場合、属性に関係なく、これらのカスタムモデルバインダーは常にデータを検証します。数行のコードを追加して、カスタムモデルバインダーにアクションのValidateInputフィルターを尊重させることができます。
// First check if request validation is required
var shouldPerformRequestValidation = controllerContext.Controller.ValidateRequest && bindingContext.ModelMetadata.RequestValidationEnabled;
// Get value
var valueProviderResult = bindingContext.GetValueFromValueProvider(shouldPerformRequestValidation);
if (valueProviderResult != null)
{
var theValue = valueProviderResult.AttemptedValue;
// etc...
}
これは、Martijn Bolandによって非常にうまく説明されています: http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/
HttpContext.Request.Unvalidated.Form ["FieldName"]のようなフィールドにアクセスしてみることができます
これらの提案は、FormCollectionと組み合わせて[ValidateInput(false)]を使用する必要があるときに発生するバグによって引き起こされる問題を修正しないことに注意してください。
参照: ASP.NET MVC 3 ValidateRequest(false)がFormCollectionで機能しない
入力モデルを使用し、必要なプロパティでAllowHtmlを使用すると、ブロックが解除されます。
public class InputModel
{
[AllowHtml]
public string HtmlInput { get; set; }
}
...
[ValidateInput(false)]
public async Task<ActionResult> ControllerMethod(InputModel model)
{
}