MVC4和ViewModel - 未显示验证消息

时间:2013-04-18 12:25:44

标签: c# asp.net-mvc regex viewmodel validation

我正在使用MVC 4和Entity Framework开发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);
}

我自己的验证员:

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>

1 个答案:

答案 0 :(得分:2)

也许将其改为

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

可以解决您的问题。

顺便说一句,最好的解决方案是使用DataAnnotations并创建自己的ValidationAttribute

public sealed class ValidNameAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        ....check regex here...
    }
}

然后你应该用Name属性装饰ValidName属性。

修改

您还可以在视图模型中实现IValidatableObject接口。 ASP.NET MVC会选择它并进行自动验证。

public class MyViewModel: IValidatableObject
{   
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (regexFails)
        {
            results.Add(new ValidationResult("Please enter valid name."));
        }
    }
}