C# MVC4和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 {

我正在使用MVC4和实体框架开发一个web应用程序。我使用的ViewModel表示要创建/编辑/删除的产品。我创建了一个验证类,用于检查条目,并在必要时显示错误消息

由于我使用的是ViewModel,很遗憾,错误消息不再显示了?我应该如何进行

以下是我的ViewModel:

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."));
        }
    }
}