【问题标题】:Basic Html.ValidationMessageFor not working基本 Html.ValidationMessageFor 不工作
【发布时间】:2013-12-10 16:33:34
【问题描述】:

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

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

这里捕获的异常是:

从 客户

在 System.Web.HttpRequest.ValidateString(字符串值,字符串 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 部分中也有 &lt;add key="ClientValidationEnabled" value="true" /&gt;,其中包括 jquery.validate.js。所以客户端和服务器端验证都失败了。

怎么了?

【问题讨论】:

    标签: c# asp.net-mvc validation


    【解决方案1】:

    从技术上讲,这不是模型的错误,这就是为什么您无法使用 Model.IsValid 代码语句处理它的原因。

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

    【讨论】:

      【解决方案2】:

      显然,保留请求验证有其优点,您正确禁用请求验证不应掉以轻心。但是在 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
          }
      }
      

      【讨论】:

      • 谢谢。如何 Response.Redirect 到 Application_Error 引发异常之前显示的页面?
      • @user277498 Request.Url 应该拥有您在遇到异常时查看所请求的页面所需的所有信息。
      • 谢谢史蒂文!如何与原始页面沟通文本存在错误,从而显示验证消息?
      • @user277498 您可以从那里将其设置为Session,或者您可以使用example.aspx?error=1 之类的查询字符串,并在页面加载时检查Session 或查询字符串。
      • 感谢您的帮助。这一切都很好,除了用户输入的原始消息将消失,他们将不得不重新输入。我仍然想知道是否有更好的方法来完成这一切。这是每个网站都必须处理的事情。所以我很惊讶它没有内置的机制。
      【解决方案3】:

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

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

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

      【讨论】:

      • 谢谢,这会关闭验证。我希望验证工作。我希望用户收到他们的输入无效的消息。我不想让他们的输入进入,也不想抛出全局异常。
      • 谢谢,但我不想对消息进行 html 编码。我只是想提示用户该条目无效并让他们修复它。
      • 重点是对它们进行编码,以便它们可以到达控制器,以便您向 ModelState 添加错误并返回带有验证错误的视图。这将实现您想要的,但它是服务器端的。如果你想通过客户端验证来做,你需要使用 Javascript 或 JQuery 编写一些自定义的东西,或者(更实用的选择)使用 JQuery Validate 插件添加自定义规则。
      【解决方案4】:

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

      【讨论】:

      • 我不想允许html,我只想通知用户他们的输入不被接受并提示他们重新输入。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多