典型的EF + MVC系统将具有两个或三个验证级别:
我找不到针对实际模型/实体/域/“业务规则”进行2 + 3验证的最佳实践。我们要么:
SaveChanges()
,如果实体处于Added
或Modified
状态,则触发验证(一次验证整个实体)这很难维持。ViewModel验证有很多想法,但是对于Model验证,它是特定于领域的,因此您需要确定一个有创意的解决方案,而我的解决方案并不是那么好。
validation asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5
我希望能够应用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.
我的自定义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()
方法?
我使用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 模块模式”。据我了解,这些模块是将各种行为聚合到整洁的命名空间中的一种方法。
但是,如果我希望能够创建一个接受参数的唯一对象实例怎么办?就目前情况而言,我无法这样做,因为所有数据都是共享/静态的。我希望能够做到这一点:
var foo = new Some.Namespace.Whatever.Foo(config);
Run Code Online (Sandbox Code Playgroud)
我无法改变该模式的结构,因为我们已经使用它有一段时间了,而且效果很好。我只是想调整它,这样我就可以在其中添加一些处理非静态数据的“类”。