小编Sai*_*udo的帖子

如何在单元测试之间重置EF7 InMemory提供程序?

我试图使用EF7 InMemory提供程序进行单元测试,但测试之间的InMemory数据库的持久性使我遇到问题.

以下代码演示了我的问题.一个测试将起作用,另一个测试将始终失败.即使我在测试之间将_context设置为null,第二次测试运行总会有4条记录.

[TestClass]
public class UnitTest1
{

    private SchoolContext _context;

    [TestInitialize]
    public void Setup()
    {
        Random rng = new Random();

        var optionsBuilder = new DbContextOptionsBuilder<SchoolContext>();
        optionsBuilder.UseInMemoryDatabase();

        _context = new SchoolContext(optionsBuilder.Options);
        _context.Students.AddRange(
            new Student { Id = rng.Next(1,10000), Name = "Able" },
            new Student { Id = rng.Next(1,10000), Name = "Bob" }
        );
        _context.SaveChanges();
    }

    [TestCleanup]
    public void Cleanup()
    {
        _context = null;
    }

    [TestMethod]
    public void TestMethod1()
    {
        Assert.AreEqual(2, _context.Students.ToList().Count());
    }

    [TestMethod]
    public void TestMethod2()
    {
        Assert.AreEqual(2, _context.Students.ToList().Count());
    } …
Run Code Online (Sandbox Code Playgroud)

unit-testing mstest entity-framework-core

52
推荐指数
4
解决办法
8663
查看次数

如何在WPF页面或UserControl对象上捕获KeyDown事件?

我有一个带有UserControl的页面.如果用户在我想要处理的页面上的任何位置按Esc.

我认为这就像挂钩PreviewKeyDown事件,测试Esc键,然后处理它一样简单.但是,当我在事件处理程序中放置断点时,我发现它永远不会被调用.我想也许UserControl可能会被击中,所以我尝试了PreviewKeyDown ......结果相同.

有没有人知道在Page对象上测试KeyDown或PreviewKeyDown的正确位置?

wpf keydown

34
推荐指数
6
解决办法
7万
查看次数

什么从ASP.NET MVC动作返回以允许jQuery ajax成功事件触发?

现在我的ajax发布所有激活他们的错误事件,即使该操作没有导致错误.我有一个ASP.NET MVC操作,看起来像:

[AcceptVerbs(HttpVerbs.Post)]
public virtual ActionResult StuffToDo(int id)
{
     // do various things that work ...
     return new JsonResult(); // i have to return something, so this...
}
Run Code Online (Sandbox Code Playgroud)

在客户端我有这个jQuery:

$('#actionClick').click(function() {
     if (confirm('Are you sure?')) {
         $.ajax({
             type: "POST",
             url: "/Customer/StuffToDo/<%= Model.Customer.Id %>",
             contentType: "application/json; charset=utf-8",
             data: "{}",
             dataType: "json",
             success: function() {
                 ShowSuccessResult("Yay!");
             },
             error: function(xhr, ajaxOptions, thrownError) {
                 ShowErrorResult("Boo! Message:" + xhr.responseText);
             }
         });
      }
      return false;
 });
Run Code Online (Sandbox Code Playgroud)

如果操作成功(没有抛出异常),那么我希望触发成功事件处理程序.相反,错误事件正在触发.有什么东西我应该传回或改变动作,以便成功事件触发?

我意识到这个问题与其他问题基本相同,但我的错误处理程序已经有了扩展的签名,解决了其他人的问题.

编辑 每个请求,这是我得到的响应:

链接到屏幕截图 (不知道如何显示它有问题)

编辑 我将返回值更改为Null以查看是否影响了任何内容,但没有更改行为. …

asp.net-mvc jquery

22
推荐指数
3
解决办法
3万
查看次数

如何从匿名类型获取属性的值?

我有一个由Linq查询填充的数据网格.当datagrid中的焦点行发生更改时,我需要设置一个等于该对象中某个属性的变量.

我试过了...

var selectedObject = view.GetRow(rowHandle);
_selectedId = selectedObject.Id;
Run Code Online (Sandbox Code Playgroud)

...但编译器根本不关心这个("嵌入式语句不能是声明或标注语句").

看起来这个属性应该很容易访问.在运行时检查对象会显示我期望的所有属性,我只是不知道如何访问它们.

如何访问匿名对象的属性?

编辑澄清:

我碰巧使用DevExpress XtraGrid控件.我用Linq查询加载了这个控件,该查询由几个不同的对象组成,因此使得数据不符合我已经拥有的任何一个类(即,我无法将其转换为任何类).

我正在使用.NET 3.5.

当我查看view.GetRow(rowHandle)方法的结果时,我得到一个如下所示的匿名类型:

{ ClientId = 7, ClientName = "ACME Inc.", Jobs = 5 }
Run Code Online (Sandbox Code Playgroud)

我的目标是从这个匿名类型获取ClientId,以便我可以做其他事情(例如在其中加载具有该客户端记录的表单).

我在早期的答案中尝试了一些建议,但无法达到我可以获得此ClientId的程度.

.net c# anonymous-types

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

如何通过UTC偏移确定时区?

我有一个场景,我有一个时区偏移(以分钟为单位),需要确定它的时区.我知道所有数据都不可用(例如,可能有几个时区的偏移量为-240分钟),但"最佳猜测"是可以接受的.

我的第一次传球看起来像这样:

foreach (var info in TimeZoneInfo.GetSystemTimeZones())
{
    if (info.BaseUtcOffset.TotalMinutes == timezoneOffset)
    {
         // do something here if this is a valid timezone
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方式有效,但我需要考虑夏令时,这有点让我失望.我添加了这个可怕的黑客:

foreach (var info in TimeZoneInfo.GetSystemTimeZones())
{
    var extra = info.IsDaylightSavingTime(DateTime.Now) ? 60 : 0;
    if (info.BaseUtcOffset.TotalMinutes + extra == timezoneOffset)
    {
         // do something here if this is a valid timezone
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做"足够好",因为当夏令时没有生效时,我可以向用户显示正确的时间,并且在夏令时期间大约70%是正确的.仍然......这对我的眼球来说是一些可怕的代码.

有一个更好的方法吗?更优雅会更好,更准确更好.

更新

从技术上讲,我可以访问Javascript可以获得的有关日期的任何信息.我有一个页面,我在其中放置了一个名为"offset"的隐藏字段.我有一个JQuery函数,用DateTime().getTimezoneOffset()填充偏移字段.虽然我没有在DateTime对象上看到任何有用的东西,但也许这会打开其他想法的途径.

javascript c# timezone utc

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

如何为PostSharp属性添加参数?

我有一个简单的PostSharp日志记录属性:

[Serializable]
public class MethodLoggingAttribute : OnMethodBoundaryAspect
{
    private ILog _logger;
    public override void OnEntry(MethodExecutionEventArgs eventArgs)
    {
        _logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString());
        _logger.DebugFormat("Entered {0}", eventArgs.Method.Name);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想通过向日志条目添加有关方法参数的信息来使此属性更加灵活,但仅在需要时才这样做.

[Serializable]
public class MethodLoggingAttribute : OnMethodBoundaryAspect
{
    private ILog _logger;
    public override void OnEntry(MethodExecutionEventArgs eventArgs)
    {
        _logger = LogManager.GetLogger(eventArgs.Method.DeclaringType.ToString());

        // if ShowParameters = true
        _logger.DebugFormat("Entered {0} with args:{1}", eventArgs.Method.Name, args);
        // else
        _logger.DebugFormat("Entered {0}", eventArgs.Method.Name);
        // endif
    }
}
Run Code Online (Sandbox Code Playgroud)

带有IF的伪代码是我不知道该怎么做的.如何将其传递给属性?我希望它看起来像这样,但我不知道如何在属性代码中处理它:

[MethodLogging(ShowParameters=true)]
public void SomeCrazyMethod(int CustomerId, string SecretName) {...}
Run Code Online (Sandbox Code Playgroud)

c# postsharp

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

如何在.Net Core Web API中停止自引用循环?

我有一些问题,我猜这些问题与使用.NET Core Web API和Entity Framework Core进行自引用有关.我添加时,我的Web API开始窒息.包括一些导航属性.

我发现旧的Web API中似乎是一个解决方案,但我不知道如何为.NET Core Web API实现相同的功能(我还处于早期学习阶段).

较旧的解决方案是将其粘贴在Global.asax的Application_Start()中:

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
Run Code Online (Sandbox Code Playgroud)

我怀疑这是在StartUp的ConfigureService()方法中处理的,但除此之外我不太了解.

或者有更合适的方法来处理这个问题吗?

c# entity-framework-core asp.net-core-webapi

15
推荐指数
3
解决办法
9346
查看次数

如何将正则表达式匹配仅添加到匹配集合中一次?

我有一个字符串,里面有几个html注释.我需要计算表达式的唯一匹配.

例如,字符串可能是:

var teststring = "<!--X1-->Hi<!--X1-->there<!--X2-->";
Run Code Online (Sandbox Code Playgroud)

我目前用这个来获得比赛:

var regex = new Regex("<!--X.-->");
var matches = regex.Matches(teststring);
Run Code Online (Sandbox Code Playgroud)

结果是3场比赛.但是,我想这只有两场比赛,因为只有两场比赛.

我知道我可以循环生成MatchCollection并删除额外的Match,但我希望有一个更优雅的解决方案.

澄清:样本字符串与实际使用的内容大大简化.很容易就有X8或X9,字符串中可能有几十个.

c# regex

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

FileStreamResult和FilePathResult之间的区别?

我有一个简单的控制器返回图像:

public class ImageController : Controller
{
    [AcceptVerbs(HttpVerbs.Get)]
    [OutputCache(CacheProfile = "StationeryImageCache")]
    public FileResult Show(int customerId, string imageName)
    {
        try
        {
            var path = string.Concat(Config.ImageDir, customerId, @"\", imageName);
            return new FileStreamResult(new FileStream(path, FileMode.Open), "image/jpeg");
        }
        catch(System.IO.FileNotFoundException ex)
        {
            throw new MissingImageException(imageName);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的经理在代码审查期间发现了FileStreamResult,并提到我应该将其与以下内容交换:

return new FilePathResult(path, "image/jpeg");
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义,所以我做到了.但是几天之后,我们其他开发人员报告说我返回的一些图像已经损坏了.具体来说,有很多图像在某些时候被切断了.图像的大小是正确的,但底部25% - 40%的图像只是消失了.

在查看文件系统上的原始图像时,它没有任何问题.我在浏览器中填充图像,看起来很好.但是我的控制器只返回了部分图像.更糟糕的是,只有一些图像是问题......大约有30%......虽然我找不到任何有用的图像和有效图像之间的差异.

在尝试调试时,我将操作的结果恢复为FileStreamResult,突然一切都恢复了.

有谁知道对此的解释?

asp.net-mvc actionresult

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

如何设置jQuery ajax帖子的contentType,以便ASP.NET MVC可以读取它?

我有一些看起来像这样的jQuery:

$.ajax({
     type: "POST",
     url: "/Customer/CancelSubscription/<%= Model.Customer.Id %>",
     contentType: "application/json",
     success: refreshTransactions,
     error: function(xhr, ajaxOptions, thrownError) {
         alert("Failed to cancel subscription! Message:" + xhr.statusText);
     }
});
Run Code Online (Sandbox Code Playgroud)

如果被调用的动作导致异常,它最终将被Global.asax Application_Error拾取,其中我有一些代码如下:

var ex = Server.GetLastError();
if (Request.ContentType.Contains("application/json"))
{
     Response.StatusCode = 500;
     Response.StatusDescription = ex.Message;
     Response.TrySkipIisCustomErrors = true;
}
else
{
     // some other way of handling errors ...
}
Run Code Online (Sandbox Code Playgroud)

当我执行发布帖子的脚本时,Request.ContentType始终是一个空字符串,因此不会遇到第一个if块.我应该在ajax"contentType"中添加一些其他值吗?或者我有另一种方式告诉asp.net内容类型应该是"application/json"吗?

澄清

我试图实现的目标是将异常消息传递回ajax错误事件.目前,即使绕过IF块,错误事件也会正确抛出警告框,但消息为"未找到".

正如您所看到的,我正在尝试将exeception消息设置为Response.StatusDescription,我相信ajax错误中的xhr.statusText设置为.

ajax asp.net-mvc jquery

14
推荐指数
2
解决办法
6万
查看次数