Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在asp.net MVC中验证仅限时间的输入不引人注目的验证_Asp.net Mvc_Validation_Asp.net Mvc 4_Unobtrusive Validation - Fatal编程技术网

Asp.net mvc 在asp.net MVC中验证仅限时间的输入不引人注目的验证

Asp.net mvc 在asp.net MVC中验证仅限时间的输入不引人注目的验证,asp.net-mvc,validation,asp.net-mvc-4,unobtrusive-validation,Asp.net Mvc,Validation,Asp.net Mvc 4,Unobtrusive Validation,我在页面上有两个单独的字段:一个用于日期,一个用于时间 这就是模型: [Required] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")] public DateTime? StartTime { get; set; } [Required] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM

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

这就是模型:

[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
字段中运行良好,但是当我在
StartTime
中输入“11:00pm”或“11:00pm”时,验证显示

“开始时间字段必须是日期”

服务器端验证在
“0:hh:mm tt”
中运行良好,只有javascript有问题。目前,我刚刚禁用了javascript验证,但希望最终能将其放在这个页面上


可以为“时间”字段执行此操作吗?

在您的视图模型中尝试此操作

    [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;
    }
}
公共类时间属性:ValidationAttribute,IClientValidable
{
公共IEnumerable GetClientValidationRules(ModelMetadata元数据,
ControllerContext(上下文)
{
返回新的ModelClientValidationRule
{
ErrorMessage=ErrorMessage,
ValidationType=“时间”
};
}
公共覆盖布尔值有效(对象值)
{
日期时间;
if(value==null | |!DateTime.TryParse(value.ToString(),out time))
返回false;
返回true;
}
}

编辑:我也知道,在某些情况下,您需要向客户机html添加一些脚本,比如在这个答案中找到的脚本,尽管我不确定什么时候需要。这个答案应该让你半途而废。不幸的是,我不确定这个答案是否会阻止回发,但它确实会将模型标记为无效。

数据类型.Time
属性添加到您的时间字段中,并使用
EditorFor
s删除格式重复:

模型

看法


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

[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)
查看:

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)

刚刚试过这个。没什么区别。事实上,它从未命中IsValid()方法。@Html.EditorFor在Chrome中呈现带有时间控件(小时、分钟、秒)的文本框。这不是我想要的,我想要一个文本框,因为我在文本框顶部使用第三方javascript控件以实现跨浏览器兼容性。如果我使用TextBoxFor,那么“DataType”属性没有帮助。事实上,我可以输入“aaa”,但它仍然通过了验证,而不是在客户端触发。我首先需要做什么使正则表达式在javascript中进行验证?再次查看代码后,我意识到您正在将ID更改为“timeStart”。如果删除此项,验证将正确启动。我一定是做错了什么。当我添加RegularExpression属性时,它会切换到仅服务器端验证。您是否删除了字段的剃须刀帮助器的
id=“timeStart”
部分?@technicallyjosh:回答得很好!一些读者可能会发现将正则表达式更改为
^(0?[1-9]| 1[0-2]):[0-5][0-9][aApP][mM]$
很有帮助。开头附近的
0?
更改使前导零在10:00之前的时间可选。接近尾声的
[aApP][mM]
变化显示了对像我这样笨拙的打字员的怜悯,他们键入aM、aM、pM或pM。