自定义控件上的DataAnnotations属性

时间:2014-03-31 12:50:35

标签: asp.net-mvc-4

我使用自定义控件(HTML Helper)来构建自动完成控制器。 它工作得很好,唯一的问题是验证问题。 在客户端,当jquery.validation.js不在图片中时,验证工作正常,(对于空文本框,它会给出错误消息)。 如果用户从自动完成中选择了某些内容,那么我很好。 但是当用户输入只是垃圾时,那么HttpPost需要处理垃圾邮件。向用户返回错误消息。 HOW ??

另外,我已经看到一个名为Remote的DataAnnotation,它可以在客户端管理验证,它更好吗?如果是这样,我如何在自定义控件上添加DataAnnotaion? 谢谢#)

这是我的代码: Index.cshtml

@using (Html.BeginForm("Index", "Create"))
                {
                    @Html.AutocompleteFor(Url.Action("AutoCompleteServiceProviders", "Create"), true, "ex. Shower", c => c.service_id, a => a.name)
                    <input type="submit" id="search" value="" />
                }

AutoComplete.cs

private static MvcHtmlString CreateAutocomplete<TModel>(this HtmlHelper<TModel> helper, string actionUrl, bool? isRequired, string placeholder, params Expression<Func<TModel, object>>[] expression)
    {
        var builder = new StringBuilder();

        foreach (var item in expression)
        {
            var attributes = new Dictionary<string, object>
                             {
                                 { "data-autocomplete", true },
                                 { "data-action", actionUrl }
                             };

            if (!string.IsNullOrWhiteSpace(placeholder))
            {
                attributes.Add("placeholder", placeholder);
            }

            if (isRequired.HasValue && isRequired.Value)
            {
                attributes.Add("required", "required");
            }

            Func<TModel, object> method = item.Compile();
            var value = (Object)null;
            if ((TModel)helper.ViewData.Model != null)
            {
                value = method((TModel)helper.ViewData.Model);
            }

            var baseProperty = (string)null;
            var hidden = (MvcHtmlString)null;
            if (item.Body is MemberExpression)
            {
                baseProperty = ((MemberExpression)item.Body).Member.Name;
                hidden = helper.Hidden(baseProperty, value);
                attributes.Add("data-value-name", baseProperty);
            }
            else
            {
                var op = ((UnaryExpression)item.Body).Operand;
                baseProperty = ((MemberExpression)op).Member.Name;
                hidden = helper.Hidden(baseProperty, value);
            }

            attributes.Add("data-value-id", "service_id");

            var automcompleteName = baseProperty + "_autocomplete";
            var textBox = (MvcHtmlString)null;
            if (value != null)
            {
                textBox = helper.TextBox(automcompleteName, value, string.Empty, attributes);
            }
            else
            {
                textBox = helper.TextBox(automcompleteName, null, string.Empty, attributes);
            }

            builder.AppendLine(hidden.ToHtmlString());
            if (baseProperty == "name")
            {
                builder.AppendLine(textBox.ToHtmlString());
            }
        }

        return new MvcHtmlString(builder.ToString());
    }

1 个答案:

答案 0 :(得分:0)

您可以从此处获得验证:

var validation = htmlHelper.ValidationMessageFor(expression, null, new Dictionary<string, object>());

更新:

我使用TagBuilder创建标签。我对tagbuilder的处理是将该验证添加到span或div标签中,让不引人注目的javascript在需要时隐藏/显示它。它返回一个MVCHtmlString,您可以将它附加到要在

中显示它的元素