16

我在页面上有两个单独的字段:一个用于日期,一个用于时间。

这是模型:

[Required]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
public DateTime? StartTime { get; set; }

[Required]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime Date { get; set; }

这是视图:

@Html.TextBoxFor(m => m.Date, "{0:MM/dd/yyyy}", new { type = "text" })
@Html.TextBoxFor(m => m.StartTime, "{0:hh:mm tt}", new { type = "text", id = "timeStart" })

javascript 不显眼的验证适用于该字段但是当我在验证显示Date中输入“11:00 PM”或“11:00 pm”时StartTime

“字段 StartTime 必须是日期”

服务器端验证工作正常,"0:hh:mm tt"只有 javascript 有问题。现在我只是禁用了 javascript 验证,但最终希望在这个页面上有它

这可以在“时间”领域完成吗?

4

3 回答 3

16

老实说,实现这一点的最简单方法是使用正则表达式验证器。这是一个例子。

[RegularExpression(@"^(0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$", ErrorMessage = "Invalid Time.")]

不显眼的验证应该适用于这个表达式。

希望这可以帮到你!

编辑

我已经修复了由于一些非法字符而开始在控制台中引发错误的正则表达式。此外,您将需要此属性的字符串属性包装器,否则它将始终寻找有效的DateTime.

以下是您应该绑定的内容。

模型:

public DateTime? StartTime { get; set; }

[Required]
[RegularExpression(@"^(0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$", ErrorMessage = "Invalid Time.")]
public string StartTimeValue
{
    get
    {
        return StartTime.HasValue ? StartTime.Value.ToString("hh:mm tt") : string.Empty;
    }

    set
    {
        StartTime = DateTime.Parse(value);
    }
}

看法:

@Html.TextBoxFor(m => m.StartTimeValue)
于 2013-06-05T19:33:59.110 回答
11

DataType.Time属性添加到您的时间字段并使用EditorFors 删除格式重复:

模型

    [Required]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
    [DataType(DataType.Time)]
    public DateTime? StartTime { get; set; }

    [Required]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime Date { get; set; }

看法

    @Html.EditorFor(m => m.Date, new { type = "text" })
    @Html.EditorFor(m => m.StartTime, new { type = "text", id = "timeStart" })
于 2013-06-05T03:21:38.917 回答
0

在你的视图模型中试试这个

    [Display(Name = "Start Time")]
    [Time]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
    public DateTime Time { get; set; }

并具有属性类

public class TimeAttribute : ValidationAttribute, IClientValidatable
{
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
                                                                        ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = ErrorMessage,
            ValidationType = "time"
        };
    }

    public override bool IsValid(object value)
    {
        DateTime time;
        if (value == null || !DateTime.TryParse(value.ToString(), out time))
            return false;

        return true;
    }
}

编辑:我也知道,在某些情况下,您需要向客户端 html 添加一些脚本,例如在这个答案MVC3 unobtrusive validation group of inputs中找到的脚本,尽管我不确定何时需要。这个答案应该能让你成功一半。不幸的是,我不确定这个答案是否会阻止回发,但它确实将模型标记为无效。

于 2013-06-04T03:05:34.597 回答