我使用自定义控件(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());
}
答案 0 :(得分:0)
您可以从此处获得验证:
var validation = htmlHelper.ValidationMessageFor(expression, null, new Dictionary<string, object>());
更新:
我使用TagBuilder创建标签。我对tagbuilder的处理是将该验证添加到span或div标签中,让不引人注目的javascript在需要时隐藏/显示它。它返回一个MVCHtmlString,您可以将它附加到要在
中显示它的元素