我正在编写MVC 4应用程序,并使用Entity Framework 4.1。我有一个验证问题,我似乎无法找到答案。
本质上,我有一个名为“Product”的实体(对象),它包含一个字段“Name”,它必须遵循严格的命名约定,这些约定在一个名为“NamingConvention”的单独实体中定义。当用户输入值时,系统需要根据NamingConvention实体中建立的规则进行检查,并在需要时返回错误。
应该在哪里进行验证,以及如何进行验证?我需要在进行验证时检查NamingConvention实体,这意味着我需要一个数据库上下文,因为我引用了一个不同的实体。是否有任何验证方法不需要我创建新的上下文?我正在考虑在Controller中进行验证,因为它已经创建了一个数据上下文,但这似乎不是正确的地方。
感谢您的帮助!
答案 0 :(得分:1)
我使用来自输入名称的网页的JQuery post(ajax)调用完成了这样的事情。然后将(名称的值)发布到控制器上的方法,该方法可以返回一个JSON值,该值包含一个标记,表示验证是否已通过,还有一条消息要返回给您的用户。例如:
网页中的Javascript:
$("#name").change(function () {
var nameVal = $(this).val();
$.post(getRoot() + "/NameController/ValidateName", { name: nameVal },
function (data) {
if (data.valid == "true") {
alert("A valid name was chosen");
} else
{
alert(data.message);
}
}, "json");
});
Controller(NameController)代码:
[HttpPost]
public ActionResult ValidateName(string name)
{
// actual validation carried out in a static utility class (Utils.IsNameValid)
// if you are loading the same validation rules from your table each time
// consider caching the data in the application cache or a static List.
bool nameIsValid = Utils.IsNameValid(name, out string ErrorMessage);
JsonResult result = new JsonResult();
result.Data = new { valid = (nameIsValid "true" : "false"), message = ErrorMessage };
return result;
}
答案 1 :(得分:0)
我正在使用EF 5,但相信你可以使用这种方法......如果我误解了你的答案,请提前道歉。
您可以在上下文(或上下文装饰器)中进行验证
public override int SaveChanges()
{
var products = this.GetChangedProducts();
foreach (var product in products)
{
this.ValidateName(product);
}
return base.SaveChanges();
}
private IEnumerable<Product> GetChangedProducts()
{
return (
from entry in _context.ChangeTracker.Entries()
where entry.State != EntityState.Unchanged
select entry.Entity)
.OfType<Product>();
}
private void ValidateName(Product product)
{
//validate here
}