我编写了自己的 HtmlHelper 扩展方法来显示时间输入。
public static MvcHtmlString TimePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
if (expression == null)
{
throw new ArgumentNullException("expression");
}
string expressionText = ExpressionHelper.GetExpressionText(expression);
string value = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model.ToString();
return TimePicker(htmlHelper, expressionText, value);
}
public static MvcHtmlString TimePicker(this HtmlHelper helper, string name, string value)
{
TagBuilder builder = new TagBuilder("input");
builder.MergeAttribute("type", "time");
builder.MergeAttribute("id", name);
builder.MergeAttribute("name", name);
if (value != null)
{
builder.MergeAttribute("value", value);
}
return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
}
这就是我的使用方式:
@Html.TimePickerFor(model => model.StartTime)
当时间无效时,我添加如下错误:
ModelState.AddModelError("StartTime", "The selected time is already taken.");
添加此错误时,它应该将 input-validation-error
类添加到输入,但事实并非如此。我无法让它工作。它确实在 ValidationSummary 中显示错误,并将该类添加到默认输入中。任何帮助将不胜感激!
我已经尝试像这样添加它,但这仍然不会添加类:
var validation = helper.GetUnobtrusiveValidationAttributes(name);
foreach (KeyValuePair<string, Object> attribute in validation)
{
builder.MergeAttribute(attribute.Key, attribute.Value.ToString());
}
编辑:找到了临时解决方法,但仍无法解决问题
ModelState modelState;
if (helper.ViewData.ModelState.TryGetValue(name, out modelState))
{
if (modelState.Errors.Count > 0)
builder.AddCssClass("input-validation-error");
}
最佳答案
您所做的并不是解决方法!这就是你应该做的事情
string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
ModelState modelState;
if (helper.ViewData.ModelState.TryGetValue(fullName, out modelState))
{
if (modelState.Errors.Count > 0)
{
builder.AddCssClass(HtmlHelper.ValidationInputCssClassName);
}
}
GetUnobtrusiveValidationAttributes
的目的是返回使非侵入式验证正常工作的属性。这些属性以名称“data-val”开头,由 jquery.validate.unobtrusive.js
<input data-val="true" data-val-required="Please supply the title." id="Title" name="Title" type="time">
您的自定义助手必须同时具备两者才能正常工作。
作为引用,请阅读InputExtensions的源代码here
但是等等!
HTML5时间输入其实是MVC原生支持的!您不需要自己编写。
public class TestModel
{
[DataType(DataType.Time)]
public DateTime MyTime { get; set; }
}
@Html.EditorFor(model => model.MyTime)
关于c# - 输入验证错误类未添加到自定义 HtmlHelper 扩展方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22623259/