DisplayFormat ApplyFormatInEditMode

Posted

技术标签:

【中文标题】DisplayFormat ApplyFormatInEditMode【英文标题】: 【发布时间】:2012-10-26 13:53:44 【问题描述】:

我在 C# 中使用 MVC 3,我有一个具有此属性的类

[DisplayFormat(DataFormatString = "0:dd MMM yyyy", ApplyFormatInEditMode = true)]

我想在用户位于EDIT MODE 时强制执行验证

数据库中的数据以datetime 类型存储,格式如下

  6/15/2009 1:45:30 PM

我收到此错误

错误字符串格式不正确

我相信问题出在

DataFormatString = "0:dd MMM yyyy"

知道如何解决吗?

【问题讨论】:

【参考方案1】:

DisplayFormat 属性实际上仅用于显示值。如果您设置ApplyFormatInEditMode,它所要做的就是在文本框中显示时将格式应用于数据内容(用于编辑)。它与验证无关。

如果您想使用您指定的格式验证输入,您可能必须创建自己的ValidationAttribute,并使用DateTime.ParseExact() 尝试确保它符合您期望的格式。唯一的缺点是除非您编写它,否则它不会附带客户端验证逻辑。

我还没有彻底测试过这个,但它应该给你一个开始。

public class DateTimeFormatAttribute : ValidationAttribute

   public int Format  get; set; 

   public override bool IsValid(object value)
   
        if (value == null)
            return true;

        DateTime val;
        try
        
            val = DateTime.ParseExact(value.ToString(), Format, null);
        
        catch(FormatException)
        
            return false;
        

        //Not entirely sure it'd ever reach this, but I need a return statement in all codepaths
        return val != DateTime.MinValue;
   

那么这只是使用它的问题。 [DateTimeFormat(Format = "dd MMM yyyy")]

更新:抱歉,我认为我没有清楚地阅读您的问题。它抱怨回发数据的原因是因为您尝试使用的格式不是标准格式。您最好在填充字段时在线实现一个常用的日期选择器,而不是让它被手动编辑或期望像这样的非标准格式。自定义显示格式非常适合显示,但是如果您想使用默认 DateTime.Parse 不理解的自定义格式进行编辑模式,我相信您必须编写自己的 ModelBinder,这是我没有做过的事情,或者您可以将视图模型上的数据类型更改为字符串并在操作方法中自己解析它(您仍然可以使用我在这种情况下提供的验证器)。要消除您的错误(但在编辑模式下也会删除您的自定义格式),您必须删除 ApplyFormatInEditMode 属性。

【讨论】:

【参考方案2】:

0:dd MMM yyyy 会期待像 06 JUN 2009 这样的字符串,而不是 6/15/2009

收到String Not in Correct Format 错误时如何输入字符串?

【讨论】:

以上是关于DisplayFormat ApplyFormatInEditMode的主要内容,如果未能解决你的问题,请参考以下文章

为什么DisplayFormat DataFormatString不起作用?

MVC3 中模型 DisplayFormat 的 DataFormat 错误

ASP.NET MVC 为编辑和显示模式应用不同的 DisplayFormat

reportmachine脚本怎么写

C# 控件 DevExpress的DateEdit设置显示日期和时间

下载EXCEL文件Utils