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