小编Bob*_*y B的帖子

验证域模型:如何以及在何处

典型的EF + MVC系统将具有两个或三个验证级别:

  1. 对于ViewModel:输入/物理验证(DataAnnotations,FluentValidation),换句话说,长度,空值,范围,正则表达式等。
  2. 对于模型:输入/物理验证(如果不使用MVC且数据来自另一个系统,WCF,表单等,则重复1)
  3. 对于模型:逻辑/“业务规则”验证

我找不到针对实际模型/实体/域/“业务规则”进行2 + 3验证的最佳实践。我们要么:

  • 将简单的验证规则放在实体的属性设置器中(但这确实很麻烦)
  • 挂钩到EF SaveChanges(),如果实体处于AddedModified状态,则触发验证(一次验证整个实体)

这很难维持。ViewModel验证有很多想法,但是对于Model验证,它是特定于领域的,因此您需要确定一个有创意的解决方案,而我的解决方案并不是那么好。

  • 是否有更好的方法或有用的工具(例如DataAnnotations或FluentValidation,但适用于域实体)?
  • 进行模型验证或触发模型验证的最佳位置在哪里?

validation asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5

5
推荐指数
1
解决办法
1145
查看次数

EF orderby/thenby combo扩展方法

我希望能够应用firstby / thenby如下的组合排序:

allOrders().sort(s => s.ProductName, s => s.OrderDate)
Run Code Online (Sandbox Code Playgroud)

所以使用这篇文章作为灵感,我写了这个扩展方法,编译很好:

public static IQueryable<T> sort<T>(this IQueryable<T> entities, params 
  Expression<Func<T, object>>[] predicates) where T : class 
{
  var sorted = entities.OrderBy(predicates[0]);
  for (int i = 1; i < predicates.Length; i++)
    sorted = sorted.ThenBy(predicates[i]);

  return sorted;
}
Run Code Online (Sandbox Code Playgroud)

我也试过这个succint版本,它也编译:

public static IQueryable<T> sort<T>(this IQueryable<T> entities, params 
  Expression<Func<T, object>>[] predicates) where T : class
{
  return predicates.Skip(1).Aggregate(
    entities.OrderBy(predicates[0]),
    (aggregate, currentPredicate) => aggregate.ThenBy(currentPredicate));
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试按a排序DateTime,我会得到以下异常:

无法将类型"System.DateTime"强制转换为"System.Object"类型.LINQ to Entities仅支持转换EDM原语或枚举类型.

我究竟做错了什么?我正在使用EF5.

c# linq linq-to-entities entity-framework linq-expressions

5
推荐指数
1
解决办法
1296
查看次数

自定义Javascript Error.toString()

我的自定义Error类:

function MyError(message) {
  this.message = message || "";
}

MyError.prototype          = new Error();
MyError.prototype.name     = "MyError";
MyError.prototype.toString = function() {
  return "[" + this.name + "] " + this.message;
};
Run Code Online (Sandbox Code Playgroud)

如果我运行,throw new MyError("test")则FF/IE控制台显示默认消息而不是预期消息[MyError] test.

如何让JS引擎使用我的toString()方法?

javascript prototypal-inheritance

5
推荐指数
1
解决办法
1448
查看次数

使用虚拟和空jQuery承诺

我使用jQuery运行多个动画并在完成后执行一些操作promises:

$.when(foo(),  
       bar(),  
       baz())  
 .done(allDone);  
Run Code Online (Sandbox Code Playgroud)

每个函数(foo等)返回一个jQuery.Promise().

现在说我想要包含一个不动画任何东西的函数,但它的时间与动画有关 - 我不能将它包含在链中,因为它不会返回一个承诺.

所以我可以像这样破解它:

function qux() {
  if (something) {
    return $(".whatever")
      .removeClass("bob")
      .addClass("fred")
      .append(/*...do stuff...*/)
      .animate({ left: "+=0" }, 0, callback ) // <-- dummy animation does nothing
      .promise();                             // <-- this is a dummy promise
  }
  else {
    return $().promise();                     // <-- this is an "empty" promise
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我可以链接它:

$.when(foo(),  
       bar(),  
       baz(),
       qux())  
 .done(allDone);  
Run Code Online (Sandbox Code Playgroud)

这有效.但是我在这里弯曲规则 - 有没有我没有考虑到的问题,或者我在某种程度上踩到了fx队列?

更新
根据以下答案,该qux()功能可以重写为:

function qux() { …
Run Code Online (Sandbox Code Playgroud)

javascript jquery promise jquery-deferred

4
推荐指数
1
解决办法
5734
查看次数

我可以将类与 javascript 模块模式一起使用吗?

我有一堆“模块”,它们遵循这篇流行文章中描述的“JavaScript 模块模式”。据我了解,这些模块是将各种行为聚合到整洁的命名空间中的一种方法。

但是,如果我希望能够创建一个接受参数的唯一对象实例怎么办?就目前情况而言,我无法这样做,因为所有数据都是共享/静态的。我希望能够做到这一点:

var foo = new Some.Namespace.Whatever.Foo(config);
Run Code Online (Sandbox Code Playgroud)

我无法改变该模式的结构,因为我们已经使用它有一段时间了,而且效果很好。我只是想调整它,这样我就可以在其中添加一些处理非静态数据的“类”。

javascript module-pattern

2
推荐指数
1
解决办法
5846
查看次数