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>