0

我正在使用 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);
}

我自己的验证器:

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>
4

1 回答 1

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."));
        }
    }
}
于 2013-04-18T12:29:05.687 回答