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>
可以改成
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."));
}
}
}