asp.net-mvc – 如何使用FluentValidation在ClientSide中验证日期?
发布时间:2020-05-24 14:49:26 所属栏目:asp.Net 来源:互联网
导读:题 下面的代码工作正常服务器端而不是客户端.为什么? 当我提交表单时,控制权转到BeAValidDate函数以检查日期是否有效.有没有办法验证日期而无需使用Fluent验证进入服务器? 脚本 script src=jquery-1.7.1.min.js type=text/javascript/scriptscript src=jque
|
题 下面的代码工作正常服务器端而不是客户端.为什么? 当我提交表单时,控制权转到BeAValidDate函数以检查日期是否有效.有没有办法验证日期而无需使用Fluent验证进入服务器? 脚本 <script src="jquery-1.7.1.min.js" type="text/javascript"></script> <script src="jquery.validate.js" type="text/javascript"></script> <script src="jquery.validate.unobtrusive.js" type="text/javascript"></script> 模型 public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(x => x.FromDate)
.NotEmpty()
.WithMessage("Date is required!")
.Must(BeAValidDate)
.WithMessage("Invalid Date");
}
private bool BeAValidDate(String value)
{
DateTime date;
return DateTime.TryParse(value,out date);
}
}
调节器 public class PersonController : Controller
{
public ActionResult Index()
{
return View(new Person { FromDate = DateTime.Now.AddDays(2).ToString()});
}
[HttpPost]
public ActionResult Index(Person p)
{
return View(p);
}
}
视图 @using (Html.BeginForm("Index","Person",FormMethod.Post))
{
@Html.LabelFor(x => x.FromDate)
@Html.EditorFor(x => x.FromDate)
@Html.ValidationMessageFor(x => x.FromDate)
<input type="submit" name="Submit" value="Submit" />
}
解决方法使用更大然后或等于验证器的技巧.适合我.Global.asax – 应用程序启动事件 FluentValidationModelValidatorProvider.Configure(x =>
{
x.Add(typeof(GreaterThanOrEqualValidator),(metadata,Context,rule,validator) =>
new LessThanOrEqualToFluentValidationPropertyValidator
(
metadata,validator
)
);
});
模型 [Validator(typeof(MyViewModelValidator))]
public class MyViewModel
{
[Display(Name = "Start date")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}",ApplyFormatInEditMode = true)]
public DateTime StartDate { get; set; }
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}",ApplyFormatInEditMode = true)]
public DateTime DateToCompareAgainst { get; set; }
}
规则 public class MyViewModelValidator : AbstractValidator<MyViewModel>
{
public MyViewModelValidator()
{
RuleFor(x => x.StartDate)
.GreaterThanOrEqualTo(x => x.DateToCompareAgainst)
.WithMessage("Invalid start date");
}
}
FluentValidationPropertyValidator public class GreaterThenOrEqualTo : FluentValidationPropertyValidator
{
public GreaterThenOrEqualTo(ModelMetadata metadata,ControllerContext controllerContext,PropertyRule rule,IPropertyValidator validator)
: base(metadata,controllerContext,validator)
{
}
public override IEnumerable<ModelClientValidationRule>
GetClientValidationRules()
{
if (!this.ShouldGenerateClientSideRules())
{
yield break;
}
var validator = Validator as GreaterThanOrEqualValidator;
var errorMessage = new MessageFormatter()
.AppendPropertyName(this.Rule.GetDisplayName())
.BuildMessage(validator.ErrorMessageSource.GetString());
var rule = new ModelClientValidationRule{
ErrorMessage = errorMessage,ValidationType = "greaterthanorequaldate"};
rule.ValidationParameters["other"] =
CompareAttribute.FormatPropertyForClientValidation(
validator.MemberToCompare.Name);
yield return rule;
}
}
控制器动作方法 public ActionResult Index()
{
var model = new MyViewModel
{
StartDate = DateTime.Now.AddDays(2),DateToCompareAgainst = default(DateTime) //Default Date
};
return View(model);
}
[HttpPost]
public ActionResult Index(Practise.Areas.FluentVal.Models.MyViewModel p)
{
return View(p);
}
视图 @using (Html.BeginForm("Index",FormMethod.Post,new { id = "FormSubmit" }))
{
@Html.Hidden("DateToCompareAgainst",Model.DateToCompareAgainst);
@Html.LabelFor(x => x.StartDate)
@Html.EditorFor(x => x.StartDate)
@Html.ValidationMessageFor(x => x.StartDate)
<button type="submit">
OK</button>
}
脚本 <script src="jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="jquery.validate.js" type="text/javascript"></script>
<script src="jquery.validate.unobtrusive.js" type="text/javascript"></script>
<script type="text/javascript">
(function ($) {
$.validator.unobtrusive.adapters.add('greaterthanorequaldate',['other'],function (options) {
var getModelPrefix = function (fieldName) {
return fieldName.substr(0,fieldName.lastIndexOf(".") + 1);
};
var appendModelPrefix = function (value,prefix) {
if (value.indexOf("*.") === 0) {
value = value.replace("*.",prefix);
}
return value;
}
var prefix = getModelPrefix(options.element.name),other = options.params.other,fullOtherName = appendModelPrefix(other,prefix),element = $(options.form).find(":input[name=" + fullOtherName +
"]")[0];
options.rules['greaterthanorequaldate'] = element;
if (options.message != null) {
options.messages['greaterthanorequaldate'] = options.message;
}
});
$.validator.addMethod('greaterthanorequaldate',function (value,element,params) {
var date = new Date(value);
var dateToCompareAgainst = new Date($(params).val());
if (isNaN(date.getTime()) || isNaN(dateToCompareAgainst.getTime())) {
return false;
}
return date >= dateToCompareAgainst;
});
})(jQuery);
</script> (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – 在ASP.NET MVC3中有一个无会话控制器的情况
- LoadControl与构造ASP.Net控件
- asp.net – 经典ASP出站TLS 1.2
- asp.net-mvc-3 – 将输入值传递给Action(ASP.Net MVC 3)
- 一些.net中应该知道的问题
- entity-framework – 将DbContext注入Repository类库
- asp.net-mvc – MVC会话过期而不是身份验证
- oauth-2.0 – AspNet身份2:自定义OAuth端点响应
- asp.net-mvc – MVC传递ID由“”分隔为动作
- asp.net-mvc – 我可以使用Visual Studio的快速版本制作ASP
推荐文章
站长推荐
- asp.net – MVC 5使用旧表单身份验证而不是OWIN
- asp.net-mvc – ASP.NET MVC,图层,模型,存储库等
- asp.net-mvc – ASP.NET MVC中的小写URL
- asp.net-mvc – 异步操作方法
- asp.net-mvc – 在asp.net mvc中使用Checkbox提交
- asp.net – 如何防止重播攻击?
- asp.net-mvc – ASP.NET MVC检查角色里面的视图
- 在Asp.net Gridview中显示多列中的行
- asp.net-mvc-2 – 为MVC2 AsyncControllers构建单
- asp.net – 如何将其他页面包含到aspx文件中
热点阅读
