【问题标题】:MVC4 AllowHtml not working with DictionaryMVC4 AllowHtml 不适用于字典
【发布时间】:2018-07-30 04:58:11
【问题描述】:

我有课

public class TemplateViewModel
{
    [AllowHtml]
    public string Template { get; set; }

    [AllowHtml]
    public Dictionary<string, string> LocalizedContents { get; set; }
}

当我为模板输入 html 代码时,没问题。 当我为 LocalizedContents 输入 html 代码时,它会提示错误

System.Web.HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (LocalizedContents[en-us]="...ate:
FB: <a href="www.faceboo...").
   at System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection)
   at System.Web.HttpValueCollection.EnsureKeyValidated(String key)
   at System.Web.HttpValueCollection.GetValues(String name)
   at System.Web.Mvc.NameValueCollectionValueProvider.ValueProviderResultPlaceholder.GetResultFromCollection(String key, NameValueCollection collection, CultureInfo culture)
   at System.Web.Mvc.NameValueCollectionValueProvider.GetValue(String key, Boolean skipValidation)
   at System.Web.Mvc.ValueProviderCollection.GetValue(String key, Boolean skipValidation)
   at System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
   at System.Web.Mvc.DefaultModelBinder.CreateEntryForModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type valueType, IModelBinder valueBinder, String modelName, Object modelKey)
   at System.Web.Mvc.DefaultModelBinder.UpdateDictionary(ControllerContext controllerContext, ModelBindingContext bindingContext, Type keyType, Type valueType)
   at System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
   at System.Web.Mvc.DefaultModelBinder.GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
   at System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
   at System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext)
   at System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model)
   at System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
   at System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor)
   at System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<BeginInvokeAction>b__19(AsyncCallback asyncCallback, Object asyncState)

[AllowHtml] 用于字典的任何解决方案?

我不喜欢使用[ValidateInput(false)],因为它会有安全问题

我也不想在我的网络配置中包含&lt;httpRuntime requestValidationMode="2.0" /&gt;

【问题讨论】:

  • 您不回发Dictionary - 您回发Dictionary 的属性(keyvalue),并且您不能将属性应用到keyvalue,所以简短的回答是否定的。

标签: asp.net-mvc-4 data-annotations asp.net-mvc-viewmodel


【解决方案1】:

实现此目的的另一种方法是为数据类型创建一个类,并为该类的属性分配 [AllowHtml]。

public class LocalizedContents
{
    [AllowHtml]
    public string Key { get; set; }

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

然后将类作为 LocalizedContents 属性的数据类型

public class TemplateViewModel
{
    public string Template { get; set; }

    public List<LocalizedContents> LocalizedContents { get; set; }
}

【讨论】:

  • 是否有替代使用 [AllowHtml] 的方法?使用静态分析代码扫描时会导致安全缺陷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 2014-07-24
  • 2021-06-20
  • 1970-01-01
  • 2011-09-05
  • 2012-10-09
相关资源
最近更新 更多