asp.net-mvc – 如何使用FluentValidation在ClientSide中验证日
发布时间:2020-12-16 04:09:46 所属栏目:asp.Net 来源:网络整理
导读:题 下面的代码工作正常服务器端而不是客户端.为什么? 当我提交表单时,控制权转到BeAValidDate函数以检查日期是否有效.有没有办法验证日期而无需使用Fluent验证进入服务器? 脚本 script src="jquery-1.7.1.min.js" type="text/javascript"/scriptscript src
|
题
下面的代码工作正常服务器端而不是客户端.为什么? 当我提交表单时,控制权转到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单点登录不工作
- ASP.NET获取当前用户名
- asp.net – 如何在不重置会话超时的情况下使用AJAX从服务器
- asp.net – 元素> system.webServer’有无效的child>元素
- 在ASP.NET MVC C#中使用Jquery更新部分视图
- asp-classic – 在经典ASP中检测字典对象
- asp.net – 何时使用Request.RegisterForDispose?
- asp.net – IIS工作进程使用大量的内存?
- asp.net-mvc – 视图中的HttpContext.User或Page.User?
- 模型绑定 – WebApi2:自定义参数绑定以绑定部分参数
推荐文章
站长推荐
- ASP.NET单元测试 – WatiN和Windows 7 / Interne
- Asp.Net Core 中的静态文件
- 您完整的ASP.net开发环境是什么?
- asp.net – ADO.NET在.NET内核可能吗?
- asp.net – .NET接口签名
- asp.net – Mono apache2 =服务暂时不可用(503)
- image – 将Viewbag数据从View传递到ASP.Net MVC
- asp.net-mvc – 开始学习ASP.NET MVC专家级的最佳
- ASP.NET Repeater以及分页控件AspNetPager
- asp.net-mvc – 使用sqlserver express时不创建数
热点阅读
