c# - 输入验证错误类未添加到自定义 HtmlHelper 扩展方法中

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

我编写了自己的 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/

相关文章:

.net - MVC 4 项目中缺少 'DotNetOpenAuth.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246'

c# - 我什么时候应该创建一个新的 DbContext()

c# - Identity 2.0 : Creating custom ClaimsIdentity eg: User. Identity.GetUserById<int>(int id) 用于每个请求验证

c# - 如何制作条件安装程序以在本地或联网计算机上查找或安装 SQL Server?

java - 如何在 Spring Boot 中使用 @NotEmpty 约束来验证 HTTP 请求正文?

php - 使用 php 检测 JSON 中的重复键

c# - 如何将两个序列合并为一个?

c# - CNG AES -> C# AES

jquery - 添加jquery.validate后表单停止提交

javascript - 我可以在 Asp.NET MVC 4 中使用异步加载节点获得一个有效的 jsTree 3.0 示例吗?