2014-03-25 31 views
2

我编写了自己的HtmlHelper扩展方法来显示时间输入。未将输入验证错误类添加到自定义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"); 
} 

回答

2

你在做什么不是解决方法!这是你应该如何去做

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的目的是返回的属性不显眼的验证工作。这些属性启动一个名为“数据-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) 
+0

感谢您的回复,这真是个巧合哈哈!我自己写了一些我发现的脚本。我使用了DataType.Time,但有些事情在我的日期和时间里并没有解决。如果我没有记错,我无法设置默认日期或最小/最大日期。感谢您的帮助和有用的源代码。 – P1nGu1n

相关问题