【问题标题】:input-validation-error class not added to custom HtmlHelper Extension Method输入验证错误类未添加到自定义 HtmlHelper 扩展方法
【发布时间】:2014-03-25 00:28:35
【问题描述】:

我编写了自己的 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");
}

【问题讨论】:

    标签: c# validation asp.net-mvc-4 html-helper


    【解决方案1】:

    您正在做的不是解决方法!这就是你应该这样做的方式

    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)
    

    【讨论】:

    • 感谢您的回复,真是巧合哈哈!我自己编写了一些我找到的脚本。我使用了 DataType.Time,但是对于日期和时间,有些事情对我来说并不奏效。如果我没记错的话,我无法设置默认日期或最小/最大日期。感谢您的帮助和有用的源代码。
    猜你喜欢
    • 2013-05-29
    • 2020-09-03
    • 1970-01-01
    • 2023-03-24
    • 2015-10-15
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    • 2014-04-29
    相关资源
    最近更新 更多