我需要做一些相当简单的事情:在我的ASP.NET MVC应用程序中,我想设置一个自定义IIdentity/IPrincipal.哪个更容易/更合适.我想要扩展默认值,以便我可以调用类似User.Identity.Id和User.Identity.Role.没什么特别的,只是一些额外的属性.
我已经阅读了大量的文章和问题,但我觉得我做得比实际更难.我觉得这很容易.如果用户登录,我想设置自定义IIdentity.所以我想,我将Application_PostAuthenticateRequest在我的global.asax中实现.但是,每次请求都会调用它,并且我不希望在每个请求上调用数据库,这些请求将从数据库请求所有数据并放入自定义IPrincipal对象.这似乎也是非常不必要,缓慢,并且在错误的地方(在那里进行数据库调用)但我可能是错的.或者数据来自何处?
所以我想,每当用户登录时,我都可以在我的会话中添加一些必要的变量,我将其添加到Application_PostAuthenticateRequest事件处理程序中的自定义IIdentity中.但是,我Context.Session在null那里,所以这也不是要走的路.
我已经在这一天工作了一天,我觉得我错过了什么.这不应该太难,对吧?我也对此附带的所有(半)相关内容感到困惑.MembershipProvider,MembershipUser,RoleProvider,ProfileProvider,IPrincipal,IIdentity,FormsAuthentication....我是唯一一个谁发现这一切非常混乱?
如果有人能告诉我一个简单,优雅,高效的解决方案,可以在IIdentity上存储一些额外的数据而不需要额外的模糊...这将是非常棒的!我知道在SO上有类似的问题,但如果我需要的答案就在那里,我一定会忽略.
asp.net asp.net-mvc forms-authentication iprincipal iidentity
要了解有关新的令人兴奋的Asp.Net-5框架的更多信息,我正在尝试使用新发布的Visual Studio 2015 CTP-6构建Web应用程序.
大多数事情看起来很有希望,但我似乎无法找到Request.IsAjaxRequest() - 我在旧的MVC项目中经常使用的功能.
有没有更好的方法来做到这一点 - 这使他们删除了这个方法 - 还是"隐藏"在其他地方?
感谢您在何处找到它或做什么的建议!
我有一个TreeView使用a HierarchicalDataTemplate绑定其数据.
它看起来像这样:
<TreeView x:Name="mainTreeList" ItemsSource="{Binding MyCollection}>
<TreeView.Resources>
<HierarchicalDataTemplate
DataType="{x:Type local:MyTreeViewItemViewModel}"
ItemsSource="{Binding Children}">
<!-- code code code -->
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)
现在,从主窗口的代码隐藏,我想得到当前选择TreeViewItem.但是,如果我使用:
this.mainTreeList.SelectedItem;
Run Code Online (Sandbox Code Playgroud)
selectedItem属于类型MyTreeViewItemViewModel.但我想得到'父母'或'约束' TreeViewItem.我没有把它传递给我的TreeViewItemModel对象(甚至不知道如何).
我怎样才能做到这一点?
我在ASP.NET MVC项目中使用了一个母版页.该母版页需要一些ViewData,它会在每个页面上显示.
如果我没有在我的控制器中设置此ViewData键,则会收到无法找到它的错误.但是,我不想在每个控制器中设置ViewData(我不想ViewData["foo"] = GetFoo();在每个控制器中说).
所以,我正在考虑在基本控制器中设置它,并让每个控制器继承自这个基本控制器.在基本控制器默认构造函数中,我设置了ViewData.我在这里找到了类似的方法:http://www.asp.net/learn/MVC/tutorial-13-cs.aspx.到目前为止一切都很好,这可行...但问题是这些数据来自某个地方的数据库.
现在,当我想对我的控制器进行单元测试时,从基本控制器继承的控制器调用它的默认构造函数.在默认构造函数中,我初始化我的存储库类以从数据库中获取此数据.结果:我的单元测试失败,因为它无法访问数据(我当然不希望他们访问这些数据).
我也不想将正确的Repository(或DataContext,无论你怎么命名)类传递给每个控制器,而控制器又将它传递给默认控制器,我可以用我的单元测试来模拟它.控制器又依赖于其他存储库类,我最终会将多个参数传递给构造函数.为我的感觉工作太多,或者我错了?还有其他解决方案吗?
我已经尝试过使用StructureMap,但最后我觉得这不会解决我的问题,因为每个控制器仍然需要调用基础构造函数来初始化存储库类,所以我不能模拟它.
这是一个类似的问题,但我发现没有给出令人满意的答案.我能否以一种简洁的方式解决这个问题,也许使用StructureMap作为解决方案?或者我应该把它吸干并将存储库传递给每个控制器并再次传递给基本控制器?再一次,对于如此简单的事情感觉就像这么多工作.谢谢!
我正在使用新的C#8可空引用类型功能,并在重构我的代码时,我遇到了这个(简化)方法:
public T Get<T>(string key)
{
var wrapper = cacheService.Get(key);
return wrapper.HasValue ? Deserialize<T>(wrapper) : default;
}
Run Code Online (Sandbox Code Playgroud)
现在,这给出了一个Possible null reference return逻辑上的警告,因为default(T)将为所有引用类型赋予null.起初我以为我会把它改成以下内容:
public T? Get<T>(string key)
但这不可能做到.它说我要么必须添加通用约束where T : class或where T : struct.但是,这是不是一种选择,因为这既可以是(我可以存储int或int?或实例FooBar在缓存或其他).我还读到了一个假定的新泛型约束,where class?但似乎没有用.
我能想到的唯一简单的解决方案是使用null forgiving运算符更改return语句:
return wrapper.HasValue ? Deserialize<T>(wrapper) : default!;
Run Code Online (Sandbox Code Playgroud)
但这感觉不对,因为它肯定是空的,所以我基本上对这里的编译器撒谎:-)
我怎样才能解决这个问题?我错过了一些完全明显的东西吗?
我需要检测是否在枚举值中设置了一个标志,哪个类型用Flag属性标记.
通常它是这样的:
(value & flag) == flag
Run Code Online (Sandbox Code Playgroud)
但是因为我需要通用泛型(有时在运行时我的事件只有一个"Enum"引用.我找不到一个简单的方法来使用&运算符.目前我这样做:
public static bool IsSet<T>(this T value, T flags) where T : Enum
{
Type numberType = Enum.GetUnderlyingType(typeof(T));
if (numberType.Equals(typeof(int)))
{
return BoxUnbox<int>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(sbyte)))
{
return BoxUnbox<sbyte>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(byte)))
{
return BoxUnbox<byte>(value, flags, (a, b) => (a & b) == b);
}
else if (numberType.Equals(typeof(short)))
{
return BoxUnbox<short>(value, flags, (a, …Run Code Online (Sandbox Code Playgroud) .NET 3.5,.NET 4.0,WPF,Silverlight,ASP.NET MVC - 现在有很多新的微软技术发布/即将推出.(我给出的示例是所有Microsoft技术,但这适用于任何语言或平台).我很好奇这是如何在你工作的公司处理的.几个例子:
这些只是让我的问题更加清晰的例子.总而言之,我想知道这个过程看起来像什么,谁负责,谁做出决定.贵公司是否会加入这个行列,还是不愿意尝试新技术?你对这种情况感到满意吗?
在我工作的公司,我们仍然使用.NET 2.0(尽管我们现在正在慢慢转向.NET 3.5),没有认真研究过ASP.NET MVC,还没有尝试过WPF等等.并且,有些人发现很难说服人们去做.否则是否公平?
让我们说,理论上,我在我的网站上有一个页面/控制器动作,它做了一些非常重的事情.完成它的操作大约需要10秒钟.
现在,我使用.NET的outputcache机制将其缓存15分钟(例如,我使用[OutputCache(Duration = 900)])如果在15分钟后缓存过期并且100个用户在10秒内再次请求页面执行该操作,会发生什么情况重处理?
很容易问题,但我不是百分百肯定.我希望它是第一,但是:-)
谢谢!
考虑以下情况:
class A
{
public int Id;
}
class B : A
{
}
class Main
{
public async Task<int> Create(Type type)
{
MethodInfo method = this.GetType().GetMethod("Create", new Type[] { typeof(string) }).MakeGenericMethod(new Type[] { type });
A a = await (Task<A>)method.Invoke(this, new object[] { "humpf" });
return a.Id;
}
public async Task<T> Create<T>(string name) where T : A
{
T t = await Foo.Bar<T>(name);
return t;
}
}
Run Code Online (Sandbox Code Playgroud)
呼叫new Main().Create(typeof(B))将失败
无法将'
System.Threading.Tasks.Task[B]'类型的对象强制转换为'System.Threading.Tasks.Task[A]'
我不太明白,因为在这种情况下,Generic Create<T>方法只返回始终从' …
我正在尝试使用Emgu CV进行图像处理项目,但我仍然不知道要求.谁能告诉我所需的dll文件是什么?我应该在哪里复制它们才能使用该包装器?请从头开始描述.谢谢.
c# ×5
asp.net-mvc ×4
generics ×3
asp.net ×2
asp.net-core ×1
async-await ×1
c#-4.0 ×1
c#-8.0 ×1
casting ×1
controller ×1
emgucv ×1
enums ×1
flags ×1
iidentity ×1
innovation ×1
iprincipal ×1
master-pages ×1
outputcache ×1
reflection ×1
treeview ×1
wpf ×1