【问题标题】:rejecting html entered in form gracefully in asp.net MVC and via jQuery Validate拒绝在 asp.net MVC 和通过 jQuery Validate 中优雅地输入表单的 html
【发布时间】:2013-12-12 19:04:38
【问题描述】:

如果用户在 TextArea 表单中输入 HTML,则不应允许该条目。应该有客户端和服务器端验证。应拒绝包含 html 的条目,并应通过适当的消息通知用户。我们如何做到这一点?

注意:这是我在此处提出的问题的后续:https://stackoverflow.com/questions/20499955/basic-html-validationmessagefor-not-working。感谢所有回答并帮助解决此问题的人。欢迎提供更好的答案。

【问题讨论】:

    标签: jquery asp.net-mvc jquery-validate


    【解决方案1】:

    由于在 TextArea 中输入 html 会引发 HttpRequestValidationException 异常,因此在管道的早期,我们只能在 Global.asax 中将其与未处理的异常一起捕获。

    在 Global.asax.cs 我们添加:

            void Application_Error(object sender, EventArgs e)
            {
                Exception ex = Server.GetLastError();
                ex = ex.InnerException ?? ex;
                if (ex is HttpRequestValidationException)
                {
                    string url = Request.Url.ToString() + "?error=1";
                    Response.Redirect(url);
                    Server.ClearError();               
                    return;
                }
                //any other exception handling that you need goes here
           }
    

    这里是标记:

    <form action="<%=Url.Action("Create") %>" method="post" class="data-entry-form" id="feedBackForm">
    <fieldset class="comment">
    
        <div class="editor-field">
            <%= Html.TextAreaFor(model => model.Comment, 10, 2, new { placeholder="your message" }) %> 
            <%= Html.ValidationMessageFor(model => model.Comment) %>
            <% if (Request.QueryString["error"] == "1")
               {
                   Response.Write("<br/><span class= 'error'>Please remove all HTML from your comment and resubmit</span>");
               } %></div>
        <br />
    
        E-mail address (optional)
          <div class="editor-field">                        
              <%= Html.TextBoxFor(model => model.Email, new { placeholder="you@youremailaddress.com" }) %>
              <%= Html.ValidationMessageFor(model => model.Email) %>
          </div>
              <input type="submit" value="Send" />
    </fieldset>
    </form>
    

    注意这一行:if (Request.QueryString["error"] == "1" 在 Application_error 中处理重定向中传递的参数

    到目前为止,我们已经进行了服务器端验证。

    对于客户端验证,我们使用 JQuery Validate 插件添加自定义规则:

        jQuery.validator.addMethod("hasNoHTML", function (value, element) {
            if (value.match(/<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/)) {
                return false;
            }
            return true;
        }, "* Please remove all HTML from your comment and resubmit");
    
        $("#feedBackForm").validate(
            {
                rules: {
                    Comment: {
                        required: true,
                        hasNoHTML: true
                    }
                }
            }
        );
    

    这里是对正则表达式的引用:http://ejohn.org/files/htmlparser.js

    以及装饰错误的css:

    .error {
        color:red;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2017-06-02
      • 1970-01-01
      相关资源
      最近更新 更多