C# MVC4和ViewModel-未显示验证消息
我正在使用MVC4和实体框架开发一个web应用程序。我使用的ViewModel表示要创建/编辑/删除的产品。我创建了一个验证类,用于检查条目,并在必要时显示错误消息 由于我使用的是ViewModel,很遗憾,错误消息不再显示了?我应该如何进行 以下是我的ViewModel:C# MVC4和ViewModel-未显示验证消息,c#,asp.net-mvc,regex,viewmodel,validation,C#,Asp.net Mvc,Regex,Viewmodel,Validation,我正在使用MVC4和实体框架开发一个web应用程序。我使用的ViewModel表示要创建/编辑/删除的产品。我创建了一个验证类,用于检查条目,并在必要时显示错误消息 由于我使用的是ViewModel,很遗憾,错误消息不再显示了?我应该如何进行 以下是我的ViewModel: public class ProductViewModel { public Product Product { get; set; } public ProductType ProductType {
public class ProductViewModel
{
public Product Product { get; set; }
public ProductType ProductType { get; set; }
public List<SelectListItem> ProductCompanies { get; set; }
}
我自己的验证器:
public static ModelStateDictionary isValid(ProductType element)
{
ModelStateDictionary errors = new ModelStateDictionary();
if (!Regex.IsMatch(element.Model, @"^[a-zA-Z0-9\s][a-zA-Z-_0-9\s]+$"))
{
errors.AddModelError("Model", "Invalid name !");
}
return errors;
}
以及显示信息的位置:
<div class="editor-label">
Model :
</div>
<div class="editor-field">
@Html.TextBoxFor(model => model.ProductType.Model, new { maxlength = 50 })
@Html.ValidationMessageFor(model => model.ProductType.Model)
</div>
型号:
@Html.TextBoxFor(model=>model.ProductType.model,新的{maxlength=50})
@Html.ValidationMessageFor(model=>model.ProductType.model)
可能会将其更改为
Maybe `errors.AddModelError("ProductType.Model", "Invalid name !");
这会解决你的问题
顺便说一下,最好的解决方案是使用DataAnnotation并创建自己的ValidationAttribute
:
public sealed class ValidNameAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
....check regex here...
}
}
然后您应该用ValidName
属性装饰Name
属性
编辑:
您还可以在视图模型中实现IValidatableObject
接口。ASP.NET MVC将获取它并执行自动验证
public class MyViewModel: IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (regexFails)
{
results.Add(new ValidationResult("Please enter valid name."));
}
}
}
公共类MyViewModel:IValidatableObject
{
公共IEnumerable验证(ValidationContext ValidationContext)
{
if(regexfailes)
{
添加(新的ValidationResult(“请输入有效名称”);
}
}
}
尝试在验证器中传递VM:IsValid(pvm)
然后添加错误,如errors.AddModelError(“ProductType.Model”,“无效名称!”)代码>。这里有点随机猜测,实际上不知道使用点是否会使MVC识别错误字段。您的第一个建议不起作用,但谢谢。但是,我将有许多字段要检查。。。如果我理解得很好,我会为每个字段创建一个类吗?在我的视图模型中,是否无法检查正则表达式?@Traffy:对不起。我犯了一个简单的错误。你能再查一下吗?
public class MyViewModel: IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (regexFails)
{
results.Add(new ValidationResult("Please enter valid name."));
}
}
}