小编and*_*351的帖子

为什么RelayCommand RaiseCanExecuteChanged不能在单元测试中工作?

我正在使用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)

测试失败,因为我的事件处理程序没有触发.这是为什么?

更新: …

c# wpf mvvm relaycommand mvvm-light

10
推荐指数
1
解决办法
2818
查看次数

如何使用不显眼的jQuery验证手动重新验证/触发验证?

我创建了自己的条件验证属性,通过继承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)

谢谢!

asp.net-mvc jquery jquery-validate unobtrusive-validation

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

实体框架4.1设计师只能为所选实体"从数据库更新模型"吗?

情况:有时数据库模式不是您认为理想的系统信息表示,您可能无法更改它.我们一直在使用Entity Framework来创建一个更好的概念模型,以便在这种情况下进行编码.这意味着从数据库更新模型,然后通过设计器或直接使用文本编辑器直接通过.edmx文件更改模型.

问题:当您从数据库更新模型时,所有精心设置的更改都会被抛出窗口.这可以使添加新实体变得非常麻烦,因为您基本上不得不通过直接编辑.edmx文件来实现这一点.

问题:是否有办法让实体框架只从数据库中更新选定的实体?或者是否可以告诉它在添加新实体时单独留下模型的其余部分?

谢谢!

c# entity-framework edmx entity-framework-4.1 edmx-designer

7
推荐指数
1
解决办法
3090
查看次数

ASP.NET会话对象中的实体框架对象上下文?

我们有一个多层的Asp.NET Web窗体应用程序.数据层有一个名为DataAccessimpements 的类,IDisposable并且我们将Entity Framework Object Context的实例作为私有字段.该类有许多公共方法返回各种实体集合,并在处理时将处置其对象上下文.

由于我们一直面临的许多问题,我们认为DataAccess在服务器上保持对象上下文(或实例)的范围更长是一个很大的好处.有人建议,以保持一个实例在HttpContext.Current.Items收集从这个职位,以便让每个Http请求一个实例.

我想知道的是:在HttpContext.Current.Session对象中存储我们的对象上下文的实例会产生什么问题/顾虑/问题?

  • 我假设Session对象已完成并在用户会话到期时设置为垃圾回收,因此实例将被正确处理.
  • 我假设大多数默认浏览器设置都会让我们的应用程序放置其SessionId cookie而不会有任何疑虑.
  • 对象上下文将要处理的数据量不是很大,并且不会对我们体面的服务器硬件造成问题,关于随时间缓存和相对较少的并发用户.

这将相对快速地实施,并且不会影响我们现有的许多单元测试.

我们将使用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)

干杯.

asp.net session entity-framework httpcontext objectcontext

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

Linq to Entities/Entity Framework删除异常

我正在使用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# sql-server linq-to-entities entity-framework exception

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