MVC4和ViewModel -验证消息未显示

本文关键字:消息 显示 验证 ViewModel MVC4 | 更新日期: 2023-09-27 18:10:03

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

因为我使用ViewModel,不幸的是错误信息不再显示?我该怎么做?

这是我的ViewModel:

public class ProductViewModel
{
    public Product Product { get; set; }
    public ProductType ProductType { get; set; }
    public List<SelectListItem> ProductCompanies { get; set; }
}

下面是我的操作(例如创建):

[HttpPost]
public ActionResult Create(ProductViewModel pvm)
{
    pvm.ProductCompanies = db.ProductCompanies.ToList().Select(s => new SelectListItem
    {
        Text = s.Name,
        Value = s.Id_ProductCompany.ToString()
    }).ToList();
    ViewBag.Id_ProductCompany = new SelectList(db.ProductCompanies, "Id_ProductCompany", "Name", pvm.ProductType.Id_ProductCompany);
    if (ModelState.IsValid)
    {
        ModelStateDictionary errors = Validator.isValid(pvm.ProductType);
        if (errors.Count > 0)
        {
            ModelState.Merge(errors);
            return View(pvm);
        }

        Product product = new Product
        {
            PurchaseDate = pvm.Product.PurchaseDate,
            SerialNumber = pvm.Product.SerialNumber,
            Id_ProductType = pvm.ProductType.Id_ProductType
        };
        ProductType productType = new ProductType
        {
            Model = pvm.ProductType.Model,
            CatalogPrice = pvm.ProductType.CatalogPrice,
            Id_ProductCompany = pvm.ProductType.Id_ProductCompany
        };
        db.ProductTypes.AddObject(productType);
        db.Products.AddObject(product);
        db.SaveChanges();
        return RedirectToAction("Index", "Person");    
    }
    return View(pvm);
}

My own validator:

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>

MVC4和ViewModel -验证消息未显示

可以改成

Maybe `errors.AddModelError("ProductType.Model", "Invalid name !");

可以解决你的问题。

顺便说一下,最好的解决方案是使用DataAnnotations并创建自己的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."));
        }
    }
}