いくつかのオプションがあります。
モデルで、HTMLを許可する必要がある各プロパティにこの属性を追加します- 最良の選択
using System.Web.Mvc;
[AllowHtml]
public string SomeProperty { get; set; }
コントローラアクションでこの属性を追加して、すべてのHTMLを許可します
[ValidateInput(false)]
public ActionResult SomeAction(MyViewModel myViewModel)
web.configのブルートフォース- 絶対にお勧めしません
web.configファイルのタグ内に、requestValidationMode = "2.0"属性を持つhttpRuntime要素を挿入します。また、pages要素にvalidateRequest = "false"属性を追加します。
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
<pages validateRequest="false">
</pages>
</configuration>
詳細:http : //davidhayden.com/blog/dave/archive/2011/01/16/AllowHtmlAttributeASPNETMVC3.aspx
上記は、デフォルトのモデルバインダーの使用法で機能します。
カスタムModelBinder
上記のコードでbindingContext.ValueProvider.GetValue()を呼び出すと、属性に関係なく、常にデータが検証されるようです。ASP.NET MVCソースを掘り下げると、DefaultModelBinderが最初に要求の検証が必要かどうかを確認してから、検証が必要かどうかを示すパラメーターを使用してbindingContext.UnvalidatedValueProvider.GetValue()メソッドを呼び出すことがわかります。
残念ながら、私たちはフレームワークコードを使用できません。それは、封印されているか、プライベートであるか、または無知の開発者が危険なことを行うのを防ぐためのものですが、AllowHtml属性とValidateInput属性を尊重する機能するカスタムモデルバインダーを作成することはそれほど難しくありません。
public class MyModelBinder: IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// 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...
}
}
}
もう1つ必要なのは、未検証の値を取得する方法です。この例では、ModelBindingContextクラスの拡張メソッドを使用します。
public static class ExtensionHelpers
{
public static ValueProviderResult GetValueFromValueProvider(this ModelBindingContext bindingContext, bool performRequestValidation)
{
var unvalidatedValueProvider = bindingContext.ValueProvider as IUnvalidatedValueProvider;
return (unvalidatedValueProvider != null)
? unvalidatedValueProvider.GetValue(bindingContext.ModelName, !performRequestValidation)
: bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
}
}
この詳細については、http://blogs.taiga.nl/martijn/2011/09/29/custom-model-binders-and-request-validation/をご覧ください。