我正在使用Nuget(4.1.23.0)上可用的当前版本的MvvmLight,并且调用RaiseCanExecuteChanged似乎在单元测试中没有做任何事情.场景非常简单,我有一个命令:
public RelayCommand FooCommand { get; private set; }
Run Code Online (Sandbox Code Playgroud)
我在视图模型构造函数中新建它并将其指向一些私有方法:
FooCommand = new RelayCommand(Foo, CanFoo);
private void Foo()
{
// do some fooing.
}
private bool CanFoo()
{
return SomeRequiredProperty != null;
}
Run Code Online (Sandbox Code Playgroud)
然后在setter中SomeRequiredProperty我调用RaiseCanExecuteChanged:
public object SomeRequiredProperty
{
get
{
return someRequiredProperty;
}
set
{
someRequiredProperty = value;
FooCommand.RaiseCanExecuteChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
现在在单元测试中,我执行以下操作:
// Arrange
var canExecuteChanged = false;
viewModel.FooCommand.CanExecuteChanged += (sender, args) => canExecuteChanged = true;
// Act
viewModel.SomeRequiredProperty = new object();
// Assert
Assert.That(canExecuteChanged, Is.True);
Run Code Online (Sandbox Code Playgroud)
测试失败,因为我的事件处理程序没有触发.这是为什么?
更新: …
我创建了自己的条件验证属性,通过继承RequiredAttribute和实现来验证客户端和服务器上的MVC模型IClientValidatable.我的想法是,如果我的模型上的布尔属性为true,则需要另一个属性.在视图中,这表示为一个复选框,用于指示是否需要填写文本框.
除了用户执行以下操作时,这非常有效:
我想在选中或取消选中复选框时重新验证表单,或者甚至更好地重新验证该字段,以便不再显示错误消息.我尝试过调用jQuery validate()方法的各种组合,但似乎没有什么能够重新运行验证.
我使用以下javascript来设置我的验证功能和相关的不显眼的适配器.
$.validator.addMethod(
"requiredif",
function(value, element, parameters) {
var selector = "#" + parameters["dependentpropertyname"];
var triggerValue = parameters["triggervalue"].toString().toLowerCase();
var actualValue = $(selector).is(":checked").toString().toLowerCase();
if (actualValue === triggerValue) return $.validator.methods.required.call(this, value, element, parameters);
return true;
});
$.validator.unobtrusive.adapters.add(
"requiredif",
["dependentpropertyname", "triggervalue"],
function(options) {
options.rules["requiredif"] = {
dependentpropertyname: options.params["dependentpropertyname"],
triggervalue: options.params["triggervalue"]
};
options.messages["requiredif"] = options.message;
}
);
Run Code Online (Sandbox Code Playgroud)
谢谢!
情况:有时数据库模式不是您认为理想的系统信息表示,您可能无法更改它.我们一直在使用Entity Framework来创建一个更好的概念模型,以便在这种情况下进行编码.这意味着从数据库更新模型,然后通过设计器或直接使用文本编辑器直接通过.edmx文件更改模型.
问题:当您从数据库更新模型时,所有精心设置的更改都会被抛出窗口.这可以使添加新实体变得非常麻烦,因为您基本上不得不通过直接编辑.edmx文件来实现这一点.
问题:是否有办法让实体框架只从数据库中更新选定的实体?或者是否可以告诉它在添加新实体时单独留下模型的其余部分?
谢谢!
我们有一个多层的Asp.NET Web窗体应用程序.数据层有一个名为DataAccessimpements 的类,IDisposable并且我们将Entity Framework Object Context的实例作为私有字段.该类有许多公共方法返回各种实体集合,并在处理时将处置其对象上下文.
由于我们一直面临的许多问题,我们认为DataAccess在服务器上保持对象上下文(或实例)的范围更长是一个很大的好处.有人建议,以保持一个实例在HttpContext.Current.Items收集从这个职位,以便让每个Http请求一个实例.
我想知道的是:在HttpContext.Current.Session对象中存储我们的对象上下文的实例会产生什么问题/顾虑/问题?
这将相对快速地实施,并且不会影响我们现有的许多单元测试.
我们将使用AutoFac和ServiceProvider类来提供实例.当需要ObjectContext的实例时,它将由类似于此的代码返回:
private static Entities GetEntities(IContext context)
{
if (HttpContext.Current == null)
{
return new Entities();
}
if (HttpContext.Current.Session[entitiesKeyString] == null)
{
HttpContext.Current.Session[entitiesKeyString] = new Entities();
}
return (Entities)HttpContext.Current.Session[entitiesKeyString];
}
Run Code Online (Sandbox Code Playgroud)
干杯.
我正在使用WPF系统,该系统使用实体框架挂钩到旧的遗留数据库.我们在调试时挂起实时数据的备份,并在空数据库上运行测试.我只在尝试从实时数据的备份中删除时收到以下错误.
这段代码:
License license = ReadLicense(id);
entities.DeleteObject(license);
entities.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
产生这个SQL:
exec sp_executesql N'delete [dbo].[Product]
where ((([Group_ID] = @0) and ([Parent_ID] = @1)) and ([Prod_ID] = @2))',N'@0 nvarchar(32),@1 nvarchar(32),@2 nvarchar(32)',@0=N'someIdValue1',@1=N'someIdValue2',@2=N'someIdValue3'
Run Code Online (Sandbox Code Playgroud)
这又产生了这个错误:
消息208,级别16,状态1,过程TrackDeletedProduct,第4行.无效的对象名称'DeletedRecords.dbo.Product_Deleted'.
如果将生成的SQL更改为"select"查询,则返回一行,以便"ReadLicense"返回一个有效的实体.我无法理解为什么这不起作用,特别是当它只针对实时数据时."许可"实体是继承自基础"产品"实体的两个实体之一.
干杯.
c# ×3
asp.net ×1
asp.net-mvc ×1
edmx ×1
exception ×1
httpcontext ×1
jquery ×1
mvvm ×1
mvvm-light ×1
relaycommand ×1
session ×1
sql-server ×1
wpf ×1