1

添加多值(标志)枚举解决方案(效果很好,谢谢)后

http://blog.codefluententities.com/tag/multi-enumeration-values/

对于我们的 MVC 项目,我们现在正在全面使用丰富文本字段获得可怕的“潜在危险的 Request.Form 值”,我们使用所见即所得的编辑器(在本例中为 summernote)生成 html。

如果我删除 Summernote 并仅提交纯文本,则这些字段可以正常工作,但是将任何 html 代码放入文本输入中都会产生错误。

幸运的是,错误来自刚刚为第 246 行的多枚举添加(上面)的代码:

Exception Details: System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (Description="...rem ipsum <strong>dolor</stron...").

Source Error: 

Line 244:                        continue;
Line 245:
Line 246:                    Add(name, nvc[name]);
Line 247:
Line 248:                }

编辑:

为清楚起见,这是有问题的整个方法:

            private void AddRange(NameValueCollection nvc)
        {
            foreach (string name in nvc)
            {
                // handle MultiSelectList templates
                const string listSelectedToken = ".list.item.Selected";
                const string listValueToken = ".list.item.Value";
                if (name.EndsWith(listSelectedToken))
                {
                    List<bool> bools = CodeFluent.Runtime.Utilities.ConvertUtilities.SplitToList<bool>(nvc[name], ',');
                    string propertyName = name.Substring(0, name.Length - listSelectedToken.Length);
                    string valueKey = propertyName + listValueToken;
                    List<string> keys = CodeFluent.Runtime.Utilities.ConvertUtilities.SplitToList<string>(nvc[valueKey], ',');
                    int j = 0;
                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < keys.Count; i++)
                    {
                        if (bools[j])
                        {
                            if (sb.Length > 0)
                            {
                                sb.Append(CodeFluentConfiguration.EntityKeyListSeparator);
                            }
                            sb.Append(keys[i]);
                            j++;
                        }
                        j++;
                    }
                    Add(propertyName, sb.ToString());
                    continue;
                }

                if (name.EndsWith(listValueToken))
                    continue;

                Add(name, nvc[name]);

            }
        }

我是否错过了多值实现中的某些内容?

谢谢,

拉斯

4

1 回答 1

0

我不认为这个错误与使用多值枚举有关。实际上,您为包含 HTML 标记的 Description 字段发布了一个值(强)。默认情况下,ASP.NET 会阻止这种情况并引发验证异常。

如果您希望您的用户输入 HTML,您必须指示 ASP.NET 授权 HTML。

更改EntityValueProvider

AddRange(context.HttpContext.Request.Unvalidated.Form); // Add Unvalidated
AddRange(context.HttpContext.Request.Unvalidated.QueryString);

或使用 web.config:validateRequestrequestValidationMode

<system.web>
  <pages validateRequest="false" />
  <httpRuntime requestValidationMode="2.0" />
</system.web>

利用AllowHtmlAttribute

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

或者ValidateInputAttribute

[HttpPost, ValidateInput(true, Exclude = "Description")]
public ActionResult Edit(int id, FormCollection collection)
{
    ...
}
于 2015-11-12T09:46:05.843 回答