基于不同的数据库表/实体验证字段

时间:2013-02-25 21:34:05

标签: asp.net asp.net-mvc entity-framework validation

我正在编写MVC 4应用程序,并使用Entity Framework 4.1。我有一个验证问题,我似乎无法找到答案。

本质上,我有一个名为“Product”的实体(对象),它包含一个字段“Name”,它必须遵循严格的命名约定,这些约定在一个名为“NamingConvention”的单独实体中定义。当用户输入值时,系统需要根据NamingConvention实体中建立的规则进行检查,并在需要时返回错误。

应该在哪里进行验证,以及如何进行验证?我需要在进行验证时检查NamingConvention实体,这意味着我需要一个数据库上下文,因为我引用了一个不同的实体。是否有任何验证方法不需要我创建新的上下文?我正在考虑在Controller中进行验证,因为它已经创建了一个数据上下文,但这似乎不是正确的地方。

感谢您的帮助!

2 个答案:

答案 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
}