我正在研究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存储为属性,因此这些方法是相同的.那是对的吗?
我正在用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,但不确定我是否应该修改代码以进行测试.
我已经阅读了许多关于测试私有方法和重构的帖子,但这是一个非常简单的类,我想知道什么是最好的选择.
我有一个System.Data.DataTable,它通过读取CSV文件来填充,该文件将每列的数据类型设置为字符串.
我想将DataTable的内容追加到现有的数据库表 - 目前这是使用SqlBulkCopy和DataTable作为源完成的.
但是,需要更改DataTable的列数据类型以匹配目标数据库表的模式,从而处理空值.
我对ADO.NET不太熟悉,所以一直在寻找一种干净的方法吗?
谢谢.
我使用Word和OpenXml在C#ASP.NET Web应用程序中提供邮件合并功能:
1)上传包含许多预定义字符串的文档以进行替换.
2)使用OpenXML SDK 2.0我打开Word文档,将mainDocumentPart作为字符串并使用Regex执行替换.
3)然后我使用OpenXML创建一个新文档,添加一个新的mainDocumentPart并将替换产生的字符串插入到这个mainDocumentPart中.
但是,新文档中的所有格式/样式等都将丢失.
我猜我可以单独复制和添加样式,定义,注释部分等来模仿原始文档.
但是有没有一种方法使用Open XML复制文档,允许我在新副本上执行替换?
谢谢.
我正在研究一个控制台应用程序,它将按照设定的时间间隔进行安排和运行,比如说每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()可以吗?我知道这通常不是好的做法,但从阅读理由不使用它看起来似乎是可接受的用法.
谢谢.
我正在使用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)
这一切都适用于单个数据库和单个会话工厂.但是应用程序使用多个数据库.
处理这个问题的最佳方法是什么?
我有一个表单,它使用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)
这应该是可能的,如果是的话,我做错了什么?谢谢.
我有一些采用以下格式的行:

我想要一个 SQL 查询,它将按 EntityId 对上述行进行分组,并按以下方式聚合位列:
我知道我可以通过将位列转换为 int 并使用 Min/Max 来做到这一点,但这感觉有点像黑客。我认为我度过了缓慢的一天并且错过了明显的解决方案......
做这个的最好方式是什么?
我正在使用 SQL Server 2008 R2,尽管通用 SQL 方法是最好的。
更新:
上面的行所需的结果集是:

我正在使用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) 我正在一个带有几个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获得单点登录行为?
我有一小段代码调用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) 我正在开发一个ASP.NET MVC 3应用程序,它使用一个复杂的模型,该模型与XML进行序列化/反序列化.
某些字段需要ISO3166国家/地区代码.我有几个已定义的枚举用于其他受限制的列表(不太可能更改),这些列表标有XmlEnum属性并使用DisplyFor/EditorFor模板整齐地显示.
为了保持一致,我创建了一个ISO3166国家代码的枚举.
但是我知道这些会改变加班时间,要求我重新构建/部署项目.
鉴于ISO3166代码的频率/可能性发生变化,这是否可以接受?
c# ×6
asp.net-mvc ×3
.net ×2
nhibernate ×2
ado.net ×1
ajax ×1
audit ×1
azure-ad-b2c ×1
enums ×1
exception ×1
interceptor ×1
logging ×1
ms-word ×1
msal.js ×1
nunit ×1
openxml ×1
sleep ×1
sql ×1
sql-server ×1
structuremap ×1
unit-testing ×1