我的网站上有一份简单的反馈表。当用户在页面中输入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。因此,客户端和服务器端验证都失败了。
有什么问题?
答案 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的属性一起使用