小编Ton*_*onE的帖子

MVC ASP.NET中HttpContext.Current和Controller.Context的区别

我正在研究MVC ASP .NET应用程序.我对两者都比较新.

在控制器中,我试图获取当前登录用户,为此似乎有两种方法:

System.Web.HttpContext.Current.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)

要么

HttpContext.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)

这些有什么区别?据我所知,在MVC框架中,控制器将当前的HttpContext存储为属性,因此这些方法是相同的.那是对的吗?

asp.net-mvc

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

单元测试和检查私有变量值

我正在用C#,NUnit和Rhino Mocks编写单元测试.以下是我正在测试的类的相关部分:

public class ClassToBeTested
{
    private IList<object> insertItems = new List<object>();

    public bool OnSave(object entity, object id)
    {
        var auditable = entity as IAuditable;
        if (auditable != null) insertItems.Add(entity);

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

我想在调用OnSave后测试insertItems中的值:

[Test]
public void OnSave_Adds_Object_To_InsertItems_Array()
{
     Setup();

     myClassToBeTested.OnSave(auditableObject, null);

     // Check auditableObject has been added to insertItems array            
}
Run Code Online (Sandbox Code Playgroud)

这是什么最好的做法?我曾考虑将insertItems作为一个带有公共get的Property添加,或者将List注入ClassToBeTested,但不确定我是否应该修改代码以进行测试.

我已经阅读了许多关于测试私有方法和重构的帖子,但这是一个非常简单的类,我想知道什么是最好的选择.

c# nunit unit-testing

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

更改填充的DataTable列数据类型

我有一个System.Data.DataTable,它通过读取CSV文件来填充,该文件将每列的数据类型设置为字符串.

我想将DataTable的内容追加到现有的数据库表 - 目前这是使用SqlBulkCopy和DataTable作为源完成的.

但是,需要更改DataTable的列数据类型以匹配目标数据库表的模式,从而处理空值.

我对ADO.NET不太熟悉,所以一直在寻找一种干净的方法吗?

谢谢.

.net c# ado.net

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

使用OpenXml和C#复制Word文档

我使用Word和OpenXml在C#ASP.NET Web应用程序中提供邮件合并功能:

1)上传包含许多预定义字符串的文档以进行替换.

2)使用OpenXML SDK 2.0我打开Word文档,将mainDocumentPart作为字符串并使用Regex执行替换.

3)然后我使用OpenXML创建一个新文档,添加一个新的mainDocumentPart并将替换产生的字符串插入到这个mainDocumentPart中.

但是,新文档中的所有格式/样式等都将丢失.

我猜我可以单独复制和添加样式,定义,注释部分等来模仿原始文档.

但是有没有一种方法使用Open XML复制文档,允许我在新副本上执行替换?

谢谢.

c# ms-word openxml

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

可接受使用Thread.Sleep()

我正在研究一个控制台应用程序,它将按照设定的时间间隔进行安排和运行,比如说每30分钟一次.其唯一目的是查询Web服务以更新一批数据库行.

Web Service API重新命令每30秒调用一次,并在设置的间隔后超时.以下伪代码作为示例给出:

listId := updateList(<list of terms>)
LOOP
  WHILE NOT isUpdatingComplete(listId)
END LOOP
statuses := getStatuses(“LIST_ID = {listId}”)
Run Code Online (Sandbox Code Playgroud)

我在C#中大致编码为:

int callCount = 0;
while( callCount < 5 && !client.isUpdateComplete(listId, out messages) )
{
    listId = client.updateList(options, terms, out messages);
    callCount++;
    Thread.Sleep(30000);
}
// Get resulting status...
Run Code Online (Sandbox Code Playgroud)

在这种情况下使用Thread.Sleep()可以吗?我知道这通常不是好的做法,但从阅读理由不使用它看起来似乎是可接受的用法.

谢谢.

c# sleep

8
推荐指数
2
解决办法
3069
查看次数

StructureMap,NHibernate和多个数据库

我正在使用Fluent NHibernate开发Asp.Net MVC 3应用程序.我只是尝试使用StructureMap添加IoC容器.

我已经实现了一个自定义控制器工厂,它使用StructureMap来创建控制器并注入依赖项.每个控制器构造函数都接受一个或多个服务,而这些服务又将DAO作为构造函数参数.每个DAO构造函数都使用一个ISessionFactory.

对于我的StructureMap NHibernate注册表,我有以下内容:

internal class NHibernateRegistry : Registry
{
    public NHibernateRegistry()
    {
        var connectionString = ConfigurationManager.ConnectionStrings["AppDb"].ConnectionString;

        For<ISessionFactory>()
                .Singleton()
                .Use(x => new AppSessionFactory().GetSessionFactory(connectionString));

        For<ISession>()
            .HybridHttpOrThreadLocalScoped()
            .Use(x => x.GetInstance<ISessionFactory>().OpenSession());
    }

}

public class AppSessionFactory
{
    public ISessionFactory GetSessionFactory(string connectionString)
    {
        return GetConfig(connectionString)
                .BuildSessionFactory();
    }

    public static FluentConfiguration GetConfig(string connectionString)
    {
        return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2005.ConnectionString(x => x.Is(connectionString)))
            .Mappings(
                x => x.FluentMappings.AddFromAssemblyOf<AppEntity>());
    }
}
Run Code Online (Sandbox Code Playgroud)

这一切都适用于单个数据库和单个会话工厂.但是应用程序使用多个数据库.

处理这个问题的最佳方法是什么?

structuremap nhibernate asp.net-mvc inversion-of-control

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

使用Ajax.BeginForm绑定HttpPostedFileBase

我有一个表单,它使用HttpPostedFileBase的默认绑定器绑定模型和文件上载.

这在使用Html.BeginForm()时工作正常.但是,我想使用AJAX执行相同的操作,因此我将其替换为Ajax.BeginForm(),相应地更改参数.

该模型仍然正确绑定,但我无法将文件上传绑定到HttpPostedFileBase.

这会绑定模型和文件上传:

<% using (Html.BeginForm("MapUpdateColumns", "RepositoryAdmin", FormMethod.Post, new { id = "UpdateDataset", enctype = "multipart/form-data" })) {%>
Run Code Online (Sandbox Code Playgroud)

这只会绑定模型:

<% using (Ajax.BeginForm("MapUpdateColumns", "RepositoryAdmin", new AjaxOptions { UpdateTargetId = "columnMappings" }, new { id = "UpdateDataset", enctype = "multipart/form-data" })) {%>
Run Code Online (Sandbox Code Playgroud)

控制器动作:

public ActionResult MapUpdateColumns(DatasetViewModel model, HttpPostedFileBase sourceFile)
Run Code Online (Sandbox Code Playgroud)

这应该是可能的,如果是的话,我做错了什么?谢谢.

ajax asp.net-mvc model-binding

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

SQL 将位列聚合为单位结果

我有一些采用以下格式的行:

在此输入图像描述

我想要一个 SQL 查询,它将按 EntityId 对上述行进行分组,并按以下方式聚合位列:

  • 已提交:如果给定 EntityId 的任何行为 0,则为 0,否则为 1
  • 已审核:如果给定 EntityId 的任何行为 0,则为 0,否则为 1
  • 查询:如果给定 EntityId 1 的任意行为 1,否则为 0

我知道我可以通过将位列转换为 int 并使用 Min/Max 来做到这一点,但这感觉有点像黑客。我认为我度过了缓慢的一天并且错过了明显的解决方案......

做这个的最好方式是什么?

我正在使用 SQL Server 2008 R2,尽管通用 SQL 方法是最好的。

更新:

上面的行所需的结果集是:

在此输入图像描述

sql sql-server sql-server-2008

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

NHibernate拦截器审计插入的对象ID

我正在使用NHibernate拦截器将有关更新/插入/删除的信息记录到我的各种实体.

记录的信息中包括实体类型和已修改实体的唯一ID.唯一ID <generator class="identity">在NHibernate映射文件中标记为a .

显而易见的问题是,当使用IInterceptor.OnSave()记录Insert操作时,尚未分配实体的Id.

如何在记录审计信息之前获取插入实体的Id?

(我已经研究过NHibernate Listeners PostSave事件,但是无法让他们使用正在使用的Spring.net配置,所以如果可能的话我想坚持使用拦截器)

码:

    // object id parameter is null...
    public override bool OnSave(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {            
        AddAuditItem(entity, INSERT);
        return false;            
    }
Run Code Online (Sandbox Code Playgroud)

nhibernate audit interceptor

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

带有Azure AD B2C和单一登录的MSAL

我正在一个带有几个Angular 4 SPA的系统上工作,每个SPA都与单独的Asp.NET Core 2.0 WebAPI进行通信。

Azure AD B2C用作每个SPA / API的身份服务,而MSAL.js用作Angular SPA的一部分。

我们希望支持单一登录,以防止用户从一个SPA切换到另一个SPA时需要重新输入凭据。

是否可以使用msal.js v0.1.7获得单点登录行为?

single-sign-on azure-ad-b2c azure-ad-msal msal.js

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

在try finally块中记录异常详细信息

我有一小段代码调用webservice客户端方法.

该方法返回一个消息数组作为out参数.这些消息通常包含已发生的任何错误的详细信息.发生错误时,也会引发异常.

我想记录消息,无论是抛出异常还是异常类型.登录finally块是否可以接受?

WebServiceClient client = GetWebServiceClient();
Console.WriteLine("Calling getUpdates...");
ItemStatus[] itemStatuses;
Message[] messages = null;
string outToken;
try
{
     outToken = client.getUpdates(inToken, out itemStatuses, out messages);
}
finally
{
     LogMessages(messages);
}
Run Code Online (Sandbox Code Playgroud)

.net c# logging exception

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

对于ISO3166国家的枚举 - 可接受的做法?

我正在开发一个ASP.NET MVC 3应用程序,它使用一个复杂的模型,该模型与XML进行序列化/反序列化.

某些字段需要ISO3166国家/地区代码.我有几个已定义的枚举用于其他受限制的列表(不太可能更改),这些列表标有XmlEnum属性并使用DisplyFor/EditorFor模板整齐地显示.

为了保持一致,我创建了一个ISO3166国家代码的枚举.

但是我知道这些会改变加班时间,要求我重新构建/部署项目.

鉴于ISO3166代码的频率/可能性发生变化,这是否可以接受?

c# enums country-codes asp.net-mvc-3

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