gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:48:10 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com