[英]How to get custom validator to validate client side?
在我的Mvc项目中,我有以下模型:
namespace CameraWebApp.Models
public class Images
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ImageId { get; set; }
[Required(ErrorMessage="Please enter your first name")]
public string SubmitterFirstName { get; set; }
[Required(ErrorMessage = "Please enter your surname name")]
public string SubmitterLastName { get; set; }
[ExistingFileName]
public string NameOfImage { get; set; }
[StringLength(140, ErrorMessage="Please reduce the length of your description to below 140 characters")]
[DataType(DataType.MultilineText)]
public string DescriptionOfImage { get; set; }
public string ImagePath { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime DateAdded { get; set; }
}
如您所见, NameOfImage
属性具有[ExistingFileName]
属性,它是一个自定义验证器,该验证器的代码如下:
//Overiding isValid to make a custom Validator
protected override System.ComponentModel.DataAnnotations.ValidationResult IsValid(object value, System.ComponentModel.DataAnnotations.ValidationContext validationContext)
{
if (value!=null)
{
string fileName = value.ToString();
if (FileExists(fileName))
{
//If the file exists use default error message or the one passed in if there is one
return new ValidationResult(ExistingImageErrorMessage ?? defaultExistingImage);
}
else
{
return ValidationResult.Success;
}
}
else
{
//If theres no value passed in then use error message or default if none is passed
return new ValidationResult(ErrorMessage ?? DefaultErrorMessage);
}
}
bool FileExists(string fileName)
{
bool exists = false;
//A list is passed all the images
List<Images> images = cameraRepo.getAllImages().ToList();
//Loops through every image checking if the name already exists
foreach (var image in images)
{
if (image.NameOfImage==fileName)
{
exists = true;
break;
}
}
return exists;
}
下面的代码正在验证客户端的每个先前属性:
@using (Html.BeginForm())
{
<div id="errorMessages">
@Html.ValidationSummary(false)
</div>
<label>base64 image:</label>
<input id="imageToForm" type="text" name="imgEncoded"/>
<label>First Name</label>
@Html.EditorFor(model => model.SubmitterFirstName)
<label>Last Name</label>
@Html.EditorFor(model => model.SubmitterLastName)
<label>Name of Image</label>
@Html.EditorFor(model => model.NameOfImage)
<label>Image Description</label>
@Html.EditorFor(model => model.DescriptionOfImage)
<input type=button id="button"value=" Camera button"/>
<input type="submit" value="Click this when your happy with your photo"/>
}
</div>
@Html.ActionLink("gfd!!", "DisplayLatest")
<script src="@Url.Content("~/Scripts/LiveVideoCapture.js")" type="text/javascript"></script>
除我的自定义验证[ExisitingFileName]外,所有验证均在客户端起作用,我不知道为什么? 有谁知道为什么会这样吗? 提前致谢!
由于它是自定义验证,因此c#mvc无法生成客户端验证:您必须为此字段实现自己的自定义客户端验证(使用Javascript)。 在其中,您可能想使用AJAX调用服务器方法来检查文件名是否已存在。
您也可以尝试使用似乎更简单的远程验证: http : //msdn.microsoft.com/zh-cn/library/ff398048(VS.100).aspx
在客户端进行验证时,您需要实现IClientValidateable。 这需要您编写客户端验证代码(javascript)和服务器端验证代码(C#)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.