0

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

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

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

谢谢你的帮助!

4

2 回答 2

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");

});

控制器(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;


  }
于 2013-02-25T23:33:21.947 回答
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
}
于 2013-02-25T23:25:46.107 回答