DisplayFormat ApplyFormatInEditMode

时间:2012-11-06 15:15:50

标签: c# asp.net asp.net-mvc-3

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

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

我想在用户位于EDIT MODE

时强制执行验证

数据库中的数据以类似{/ p>的格式datetime存储

  6/15/2009 1:45:30 PM

我收到此错误

  

错误字符串的格式不正确

我认为问题在于

DataFormatString = "{0:dd MMM yyyy}"

任何想法如何修复它?

2 个答案:

答案 0 :(得分:5)

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,我相信,这就是我想要的没有完成,或者你可以将viewmodel上的数据类型更改为字符串,并在action方法中自己解析它(你仍然可以使用我在这种情况下提供的验证器)。要摆脱错误(但在编辑模式下也会删除自定义格式),您必须删除ApplyFormatInEditMode属性。

答案 1 :(得分:0)

0:dd MMM yyyy期望使用06 JUN 2009而不是6/15/2009这样的字符串。

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