每当用户在我的web应用程序中的页面中发布包含<或>的内容时,我都会引发此异常。

我不想因为有人在文本框中输入了字符而引发异常或使整个web应用程序崩溃,但我正在寻找一种优雅的方式来处理这一问题。

捕获异常并显示

出现错误,请返回并重新键入整个表单,但这次请不要使用<

我觉得不够专业。

禁用后验证(validateRequest=“false”)肯定可以避免此错误,但这会使页面容易受到许多攻击。

理想情况下:当发生包含HTML限制字符的回发时,表单集合中的回发值将自动进行HTML编码。因此,我的文本框的.Text属性将是&lt;html&gt;

有没有办法让我从处理者那里做到这一点?


当前回答

如果您使用的是framework 4.0,则web.config中的条目(<pages validateRequest=“false”/>)

<configuration>
    <system.web>
        <pages validateRequest="false" />
    </system.web>
</configuration>

如果您使用的是框架4.5,则web.config中的条目(requestValidationMode=“2.0”)

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" requestValidationMode="2.0"/>
</system.web>

如果你只想要一个页面,那么在aspx文件中,你应该把第一行放在下面:

<%@ Page EnableEventValidation="false" %>

如果您已经有类似于<%@页面的内容,那么只需添加rest=>EnableEventValidation=“false”%>

我建议不要这样做。

其他回答

您还可以使用JavaScript的转义(字符串)函数来替换特殊字符。然后服务器端使用server.URLDecode(字符串)将其切换回来。

这样,您就不必关闭输入验证,其他程序员将更清楚地知道字符串可能包含HTML内容。

您可以使用以下内容:

var nvc = Request.Unvalidated().Form;

稍后,nvc[“yourKey”]应该会起作用。

我有一个Web表单应用程序在文本框注释字段中遇到了这个问题,用户有时会在其中粘贴电子邮件文本,电子邮件标题信息中的“<”和“>”字符会在其中爬行并引发此异常。

我从另一个角度解决了这个问题。。。我已经在使用Ajax控件工具包,所以我能够使用FilteredTextBoxExtender来防止这两个字符进入文本框。用户复制粘贴文本将得到他们期望的结果,减去这些字符。

<asp:TextBox ID="CommentsTextBox" runat="server" TextMode="MultiLine"></asp:TextBox>
<ajaxToolkit:FilteredTextBoxExtender ID="ftbe" runat="server" TargetControlID="CommentsTextBox" filterMode="InvalidChars" InvalidChars="<>" />

在.Net 4.0及更高版本(通常情况下)中,将以下设置放入system.web中

<system.web>
     <httpRuntime requestValidationMode="2.0" />

另一种解决方案是:

protected void Application_Start()
{
    ...
    RequestValidator.Current = new MyRequestValidator();
}

public class MyRequestValidator: RequestValidator
{
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
    {
        bool result = base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);

        if (!result)
        {
            // Write your validation here
            if (requestValidationSource == RequestValidationSource.Form ||
                requestValidationSource == RequestValidationSource.QueryString)

                return true; // Suppress error message
        }
        return result;
    }
}