基本Html.ValidationMessageFor不工作

时间:2013-12-10 16:33:34

标签: c# asp.net-mvc validation

我的网站上有一份简单的反馈表。当用户在页面中输入html时,他们应该收到验证错误消息。但他们没有。抛出并引入异常:

void Application_Error(object sender, EventArgs e)
{
   ...
}

此处捕获的异常是:

  

从中检测到一个潜在危险的Request.Form值   客户端

     

at System.Web.HttpRequest.ValidateString(String value,String   collectionKey,RequestValidationSource requestCollection)

这是Asp.net MVC标记:

<form action="<%=Url.Action("Create") %>" method="post" class="data-entry-form">
<fieldset class="comment">
    Your thoughts:
    <div class="editor-field">
        <%= Html.TextAreaFor(model => model.Comment, 10, 2, new { placeholder="your message" }) %> 
        <%= Html.ValidationMessageFor(model => model.Comment) %>
    </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>

这是生成的html:

    <form action="/feedback/Create/" method="post" class="data-entry-form">
    <fieldset class="comment">
        Your thoughts:
        <div class="editor-field">
            <textarea cols="2" id="Comment" name="Comment" placeholder="your message" rows="10">
            </textarea> 
        </div>
        <br />

        E-mail address (optional)
        <div class="editor-field">                        
           <input id="Email" name="Email" placeholder="you@youremailaddress.com" type="text" value="" />                  
        </div>
        <input type="submit" value="Send" />
    </fieldset>
    </form>

这是控制器代码:

[HttpPost]
public ActionResult Create(Feedback feedback)
{
    if (ModelState.IsValid)
    {
        FillFeedbackObject(feedback);
        feedbackRepository.AddFeedback(feedback);
        return View("SuccessMessage", new SuccessMessageModel("Thanks for your message!"));
    }
    return View(feedback);
}

我在web.config文件的appSettings部分也有<add key="ClientValidationEnabled" value="true" />,我包含了jquery.validate.js。因此,客户端和服务器端验证都失败了。

有什么问题?

4 个答案:

答案 0 :(得分:2)

从技术上讲,这不是模型的错误,这就是为什么你不能用Model.IsValid代码语句处理它。

如果您实际允许在此字段中提交html或想要在服务器上清理提交的值,则可以使用[AllowHtml]属性注释模型的Comment属性。此外,如果您想要通知用户他们不能在文本中包含标签,您可以使用ModelState.AddModelError()方法在服务器端进行反馈解析时向ModelState添加错误。

答案 1 :(得分:1)

尝试将[ValidateInput(false)]属性添加到控制器操作方法中。

来源:http://msdn.microsoft.com/en-us/library/system.web.mvc.validateinputattribute.aspx

编辑:如果您仍想验证,则应在发送到服务器之前对输入进行编码,例如使用HttpUtility.HtmlEncode。验证阻止代码的原因是因为它可能是恶意的。通过编码,您可以允许它通过并仍然启用验证。但是,您可能需要更改验证规则/属性以考虑编码。如果之前不清楚,此选项需要在到达控制器后在服务器端进行验证,根据需要向ModelState添加错误,并在出现错误时根据需要返回相同的视图或部分视图。

答案 2 :(得分:1)

显然,保留请求验证具有优势,并且您的正确禁用请求验证不应该被轻视。但是在ASP.NET中没有优雅的方法来处理这个异常,因为它在管道中发生得如此早。这是保护你自己的实际框架。

您可以使用原始帖子中指出的Application_Error事件。提出了一些代码:

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    if (exception is HttpRequestValidationException)
    {
        // use Response.Redirect to get the user back to the page, and use session/querystring to display an error
    }
}

答案 3 :(得分:0)

使用MVC 3及更高版本,您可以将AllowHtml属性与包含某些html的属性一起使用