2014-03-25 55 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

相關問題