ASP.Net MVC TextBoxFor忽略我的格式

时间:2015-05-25 11:00:58

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

我创建了一些辅助方法并在其中创建TextBoxFor。

input.AppendLine(html.TextBoxFor(expression, format, attributes).ToString());

我的格式为“{0:dd / MM / yyyy}”。它的工作完全正常并呈现为

<input class="form-control req" data-val="true" data-val-date="The field detr must be a date." id="detr" name="detr" type="text" value="25/05/2558" />

但是当ModelState在此字段上出错时,TextBoxFor完全忽略了我的格式并呈现为

<input class="input-validation-error form-control req" data-val="true" data-val-date="The field detr must be a date." id="detr" name="detr" type="text" value="28/5/2558 0:00:00" />

这里发生了什么?

我该如何解决这个问题?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

我终于找到了这种奇怪现象的来源。

当我使用FluentValidator并明确调用

时会发生这种情况
validator.validate(obj)

当我将它添加到ModelState中时,ModelState的属性RawValue数据类型是DateTime。一切都搞砸了。 (如果没有显式调用,但将验证器设置为类属性RawValue数据类型将为字符串)

所以我找到了两种方法来解决这个问题。

1st:只需将validator设置为class属性,而不是显式调用验证器。

[FluentValidation.Attributes.Validator(typeof(objValidator))]

第二步:创建新的ModelState并手动添加模型错误。

        var _validator = new ObjValidator();
        var results = _validator.Validate(dto);
        ModelStateDictionary modelStateDicts = new ModelStateDictionary();

        foreach (KeyValuePair<string, ModelState> kv in ModelState.Where(x => results.Errors.Count(y => y.PropertyName == x.Key) > 0))
        {
            modelStateDicts.AddModelError(kv.Key, results.Errors.FirstOrDefault(x=>x.PropertyName == kv.Key).ErrorMessage);
        }