C# MVC中日期时间的验证
来自winforms,我对MVC和学习还很陌生。所以请容忍我。 我试图在MVC中以正确的方式进行一些验证。我有一些使用JS的代码,但我想修改它以使用MVC进行验证 这是我的模型C# MVC中日期时间的验证,c#,asp.net-mvc-4,razor,C#,Asp.net Mvc 4,Razor,来自winforms,我对MVC和学习还很陌生。所以请容忍我。 我试图在MVC中以正确的方式进行一些验证。我有一些使用JS的代码,但我想修改它以使用MVC进行验证 这是我的模型 public class MyViewModel { /// <summary> /// Start Date /// </summary> [DataType(DataType.Date)] [DisplayFormat(DataFormatStri
public class MyViewModel
{
/// <summary>
/// Start Date
/// </summary>
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:d}",ApplyFormatInEditMode=true)]
[Display(ResourceType = typeof(UIResources.GeneralPurpose), Name = "StartDate")]
public DateTime StartDate { get; set; }
/// <summary>
/// End Date
/// </summary>
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
[Display(ResourceType = typeof(UIResources.GeneralPurpose), Name = "EndDate")]
public DateTime EndDate { get; set; }
}
公共类MyViewModel
{
///
///开始日期
///
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:d}”,ApplyFormatInEditMode=true)]
[显示(ResourceType=typeof(UIResources.GeneralPurpose),Name=“StartDate”)]
公共日期时间起始日期{get;set;}
///
///结束日期
///
[数据类型(DataType.Date)]
[DisplayFormat(DataFormatString=“{0:d}”,ApplyFormatInEditMode=true)]
[显示(ResourceType=typeof(UIResources.GeneralPurpose),Name=“EndDate”)]
公共日期时间结束日期{get;set;}
}
这就是我的html的外观
@model MyViewModel
@using ...
{
<div id="ErrMsg" class="validation-summary-errors center">
</div>
using (Ajax.BeginForm("someAction", "someController", new AjaxOptions()))
{
@Html.ValidationSummary()
<fieldset class="control-set-container no-border">
<ul class="undecorated-list inline-list-items">
<li>
@Html.LabelFor(model => model.StartDate)
@Html.MyDateTimePicker(model => model.StartDate)
</li>
<li>
@Html.LabelFor(model => model.EndDate)
@Html.MyDateTimePicker(model => model.EndDate)
</li>
</ul>
</fieldset>
}
@model MyViewModel
@使用。。。
{
使用(Ajax.BeginForm(“someAction”、“someController”、新的AjaxOptions())
{
@Html.ValidationSummary()
-
@LabelFor(model=>model.StartDate)
@MyDateTimePicker(model=>model.StartDate)
-
@LabelFor(model=>model.EndDate)
@MyDateTimePicker(model=>model.EndDate)
}
@MyDateTimePicker编写一些Html,给出一个文本框和一个datepicker控件(用于以某种日期格式显示日期的文本框)
这就是我想要验证的
var obj=$('#txtDatetime');
Call-CheckDate(obj);
要验证的地方MVC允许您通过使用远程
属性或创建新属性来创建自定义验证属性
Remote
属性允许您让jquery在字段验证期间向指定的方法发送Ajax调用,此时将抛出onfocusout事件
例如,我的UserController中有一个方法,可以确保同一用户ID在应用程序中不会被使用两次:
[Remote("UnicityUserId", "User", ErrorMessageResourceName = "ErrorUnicity", ErrorMessageResourceType = typeof(Resources.Resources), AdditionalFields = "ID")]
public string UserId {get;set;}
然后,在我的控制器中:
public JsonResult UnicityUserId(string UserId, string ID)
{
int id = 0;
Int32.TryParse(ID, out id);
bool ok = false;
if (!String.IsNullOrEmpty(UserId))
ok = !UserDb.Exist(this.db, this.Tracer, UserDb.UserId, UserId, id); //Checks wether there is already another user with the same UserId
return (Json(ok, JsonRequestBehavior.AllowGet));
}
更多信息
另一种验证模式是在MVC将接收您的POST数据并尝试将其绑定到您的模型时执行的
对于此方法,必须创建自己的属性
仍然来自unicity示例:
public class UnicityAttribute : ValidationAttribute
此类必须实现名为IsValid
的方法,该方法将执行验证并将ValidationResult
返回给MVC的ModelBinder
为了确保MVC会调用它,只需将属性放在字段上:
[UnicityAttribute]
public string UserId {get;set;}
更多信息在此处输入代码
使用制度;
使用System.Collections.Generic;
使用System.ComponentModel.DataAnnotations;
使用System.Web.Mvc;
名称空间属性
{
[AttributeUsage(AttributeTargets.Property)]
公共密封类MinimumPaymentDateAttribute:ValidationAttribute,IClientValidable
{
私有只读字符串错误消息;
公共字符串ValidationErrorMessage{get{return errorMessage;}}
///
///初始化变量的构造函数
///
public MinimumPaymentDateAttribute()
{
}
///
///初始化变量的构造函数
///
///
public MinimumPaymentDateAttribute(字符串验证错误消息)
{
this.errorMessage=validationErrorMessage;
}
///
///为实现客户端验证的规则进行验证
///
///
///
///
受保护的重写ValidationResult有效(对象值,ValidationContext ValidationContext)
{
if(null!=validationContext)
{
PaymentInformation paymentInfo=(PaymentInformation)validationContext.ObjectInstance;
if(值!=null&&validationContext!=null)
{
如果(paymentInfo.PaymentDate[UnicityAttribute]
public string UserId {get;set;}
enter code here
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace Attributes
{
[AttributeUsage(AttributeTargets.Property)]
public sealed class MinimumPaymentDateAttribute : ValidationAttribute, IClientValidatable
{
private readonly string errorMessage;
public string ValidationErrorMessage { get { return errorMessage; } }
/// <summary>
/// Constructor for intializing variables
/// </summary>
public MinimumPaymentDateAttribute()
{
}
/// <summary>
/// Constructor for intializing variables
/// </summary>
/// <param name="validationErrorMessage"></param>
public MinimumPaymentDateAttribute(string validationErrorMessage)
{
this.errorMessage = validationErrorMessage;
}
/// <summary>
/// Validation for of Rule implement Client Validation
/// </summary>
/// <param name="value"></param>
/// <param name="validationContext"></param>
/// <returns></returns>
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (null != validationContext)
{
PaymentInformation paymentInfo = (PaymentInformation)validationContext.ObjectInstance;
if (value != null && validationContext != null)
{
if (paymentInfo.PaymentDate < paymentInfo.MinDate)
{
return new ValidationResult(this.ValidationErrorMessage);
}
}
}
return ValidationResult.Success;
}
/// <summary>
/// Validation rules client side for Minimum Date
/// </summary>
/// <param name="metadata"></param>
/// <param name="context"></param>
/// <returns>IEnumerable<ModelClientValidationRule></returns>
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
string errorMessage = this.FormatErrorMessage(metadata.DisplayName);
ModelClientValidationRule MinDateRule = new ModelClientValidationRule();
DateTime? validationData = GetValidationParameters(context.Controller.ViewData.Model);
MinDateRule.ErrorMessage = errorMessage;
MinDateRule.ValidationType = "validminpaymentdate";(Java script function name)
MinDateRule.ValidationParameters.Add("mindate", validationData);
yield return MinDateRule;
}
/// <summary>
/// Checking for Model type for handling Different ViewData
/// </summary>
/// <param name="model"></param>
/// <returns>string[]</returns>
private static DateTime? GetValidationParameters(object model)
{
DateTime? MinDate=null;
if (model.GetType() == typeof(PaymentInformation))
{
PaymentInformation obj = (PaymentInformation)model;
return obj.MinDate;
}
else if (model.GetType() == typeof(PaymentViewModel))
{
PaymentViewModel obj = (PaymentViewModel)model;
return obj.PaymentInfo.MinDate;
}
return MinDate;
}
}
}
$.validator.addMethod("validminpaymentdate", function (value, element, params) {
var valid = true;
var mindate = new Date(params);
var valdate = new Date(value);
if (valdate < mindate) {
valid = false;
}
return valid;
});
$.validator.unobtrusive.adapters.addSingleVal("validminpaymentdate", "mindate");