5

我正在尝试利用 HTML.ValidationMessage() 元素来使用 jQuery 编写非常自定义的客户端验证。这甚至可能吗?我的服务器端验证使用 HTML.ValidationMessage() 显示,我想知道如何在表单提交之前访问该元素以使用 jQuery 显示自定义消息。

我知道有一些插件可以做这些事情,但我真的很想完全控制我的验证。

这是我目前拥有的一些 Javascript 代码。基本上它在提交时将验证“类”添加到输入元素,但不确定如何访问 Html.ValidationMessage 以输出“需要电子邮件”之类的内容。

    <script type="text/javascript">
    $(document).ready(function() {
        $("input[type=submit]").click(function() {

            var valid = true;

            // email blank
            if ($("input[name='email']").val().length < 1) {
                $("input[name='email']").addClass("input-validation-error");
                valid = false;
            }

            return valid;
        })
    });

</script>

和视图中的代码:

       <p>
            <label for="email">
                Email:</label>
            <%= Html.TextBox("email") %>
            <%= Html.ValidationMessage("email") %>
        </p>
4

4 回答 4

8

您可以编写大量代码来执行此操作。或者您可以只使用xVal,它是免费的,并且可以做到这一点,还有更多。在您的 .NET 类型上添加值注释,向您的 aspx 添加一些简单的东西,然后您就可以免费获得 jQuery 验证。此外,它还附带流行框架的提供程序,并且它非常可定制,以防您需要更复杂的验证。

我认为没有必要在这里重新发明轮子。

于 2009-03-19T14:02:15.243 回答
2

将 jquery 表单验证插件用于客户端是否是一个想法?在视图代码中很容易实现。您在输入框中添加一些标签并在标题中添加几行 javascript,您就完成了。当然,您仍然必须编写任何“非常自定义”的代码。

于 2009-03-19T15:00:33.527 回答
1

如果您将消息静态放在页面中并将其显示设置为“无”,则可以在更改输入字段的类的同时显示该消息。

    <p>
        <label for="email">
            Email:</label>
        <%= Html.TextBox("email") %><span style="display:none" class="email-error">Email required</span>
        <%= Html.ValidationMessage("email") %>
    </p>

然后在你的 JS 中添加这行下面的部分改变这个:

        if ($("input[name='email']").val().length < 1) {
            $("input[name='email']").addClass("input-validation-error");
            valid = false;
        }

对此:

        if ($("input[name='email']").val().length < 1) {
            $("input[name='email']").addClass("input-validation-error");
            $("span.email-error").show();
            valid = false;
        }

您可能需要一些 CSS 来相应地定位这些内容,但从功能上讲,它应该可以满足您的需求。

编辑:

为避免额外的标记替换:

$("span.email-error").show();

和:

$("input[name='email']").after('<span style="display:none" class="email-error">Email required</span>');
于 2009-03-19T13:48:16.447 回答
0

创建一个 HtmlHelper,它是一个 ValidatedTextBox。我已经在我的模型上使用反射完成了这项工作,创建了一个带有验证的完全动态的 jQuery 集成,但是一个更简单的版本会像这样工作(这可能会工作,但目前还没有经过测试)。一个很好的起点:

public static MvcForm BeginClientValidatedForm(this HtmlHelper helper, string formId)
{
    HttpResponseBase response = helper.ViewContext.HttpContext.Response;
    if (helper.ViewData.ModelState.IsValid)
    {
        response.Write("<ul class=\"validation-summary-errors\"></ul>\n\n");
    }

    response.Write(ClientValidationHelper.GetFormValidationScript(formId));
    response.Write("\n");

    // Inject the standard form into the httpResponse.
    var builder = new TagBuilder("form");
    builder.Attributes["id"] = formId;
    builder.Attributes["name"] = formId;
    builder.Attributes["action"] = helper.ViewContext.HttpContext.Request.Url.ToString();
    builder.Attributes["method"] = HtmlHelper.GetFormMethodString(FormMethod.Post);
    response.Write(builder.ToString(TagRenderMode.StartTag));

    return new MvcForm(response);
}

以及相应的“GetFormValidationScript”:

public static string GetFormValidationScript(string formId)
  {
    string scriptBlock =
    @"<script type=""text/javascript"">
    $(document).ready(function() {{
      $(""#{0}"").validate({{
        meta:""rules"",
        onkeyup:false,
        onfocusout:false,
        onclick:false,
        errorClass:""input-validation-error"",
        errorElement:""li"",
        errorLabelContainer:""ul.validation-summary-errors"",
        showErrors: function(errorMap, errorList) {{
            $(""ul.validation-summary-errors"").html("""");
            this.defaultShowErrors();
      }}";

      // etc...this is the standard jQuery.validate code.

      return string.Format(scriptBlock, formId);


  }

public static string ClientValidatedTextbox(this HtmlHelper htmlHelper, string propertyName, IDictionary<string, object> htmlAttributes, string validationType)
{
    var cssClassBuilder = new StringBuilder();
    cssClassBuilder.Append("text ");
    if (htmlAttributes == null)
    {
        htmlAttributes = new Dictionary<string, object>();
    }
    else if(htmlAttributes.ContainsKey("class"))
    {
        cssClassBuilder.Append(htmlAttributes["class"]);
    }

    switch validationType
    {
      case "email":
        cssClassBuilder.Append(" {rules: {email: true, messages: {email: 'A valid email is required.'}} } ");
        break;
    }

    htmlAttributes["class"] = cssClassBuilder.ToString();

    return htmlHelper.TextBox(propertyName, htmlAttributes);
}
于 2009-03-19T13:52:37.543 回答