官方身份2示例项目的代码如下 UserManager.Create()
public static UserManager Create(IdentityFactoryOptions<UserManager> options, IOwinContext context) {
//...etc...
// --- what does this block do? ---
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null) {
manager.UserTokenProvider = new DataProtectorTokenProvider<User>(dataProtectionProvider.Create("ASP.NET Identity"));
}
// --------------------------------
//...etc...
}
Run Code Online (Sandbox Code Playgroud)
alpha/beta/RTM Identity文档很糟糕或根本不存在.
这是做什么的?
许多开发人员这样做:
public void foo() {
if (flag) {
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢"早退",所以这样做:
public void foo() {
if (!flag) return;
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
在ASP.NET-MVC Razor视图中,中止/跳过/取消渲染视图/部分视图的正确方法是什么?例如,我如何转换它:
@if (flag) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这样的事情:
@if (!flag) { /* what do I do here to abort/skip/cancel the rendering? */ }
// do stuff
Run Code Online (Sandbox Code Playgroud)
我已经尝试过使用return和播放Request,但我不确定这会如何影响这个过程.这样做的正确方法是什么?
我有一些共享代码,我想在众多解决方案中分享.大多数示例使用命令行,但我想使用Visual Studio 2013(和/或TortoiseGit)执行此操作?
- SolutionShared
- .git
- Project1Shared
- Project2Shared
- Solution1
- .git
- ProjectFoo
- ProjectBar
- [SolutionShared]
- [Project1Shared]
- [Project2Shared]
- Solution2
- .git
- ProjectBaz
- ProjectQux
- [SolutionShared]
- [Project1Shared]
- [Project2Shared]
Run Code Online (Sandbox Code Playgroud)
我所做的是创建一个新的解决方案SolutionShared,在那里添加我的所有共享代码,并将其添加到自己的git仓库.然后我使用TortoiseGit(因为我无法弄清楚如何做Visual Studio)将该共享repo作为git子模块添加到Solution1和Solution2.
1.我在Visual Studio中做什么?
我的两个解决方案现在有一个SolutionShared目录.我只是在Visual Studio中添加它的两个子项目(Project1Shared和Project2Shared)吗?
2.如何从非共享项目中更改共享代码
如果我在其中一个非共享解决方案中并对子模块中的某些内容进行了更改,我该如何提交并将其推回到共享解决方案的repo(SolutionShared),以便所有引用它的解决方案都可以使用它?
我希望下面的gulp调用一个接一个地同步运行.但他们不遵守命令.
在运行序列节点模块没有帮助在这里,因为我并不想串联运行一饮而尽任务(即它的语法类似于gulp.task("mytask", ["foo", "bar", "baz"]等等),而是在一系列吞掉"来电",你见下文.
gulp.task("dostuff", function (callback) {
gulp
.src("...")
.pipe(gulp.dest("...");
gulp
.src("...")
.pipe(gulp.dest("...");
gulp
.src("...")
.pipe(gulp.dest("...");
callback();
});
Run Code Online (Sandbox Code Playgroud)
如何让它们一个接一个地运行?
我通常会像这样执行警卫检查:
public void doStuff(Foo bar, Expression<Func<int, string>> pred) {
if (bar == null) throw new ArgumentNullException();
if (pred == null) throw new ArgumentNullException();
// etc...
}
Run Code Online (Sandbox Code Playgroud)
我已经看到这个额外的检查确保谓词实际上是一个lambda:
if (pred.NodeType != ExpressionType.Lambda) throw new ArgumentException();
Run Code Online (Sandbox Code Playgroud)
该ExpressionType枚举有很多可能性,但我不知道如何任何人的规定将适用,因为我假定编译器将只允许一个lambda.
Q1:这有什么好处?我们对所有输入进行彻底的保护检查,这是否会增加价值?
Q2:是否存在性能损失 - 即它需要比常规类型/边界/空检查更长的时间吗?
我在程序集中有以下方法:
public string dostuff(string foo, object bar = null) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
我将它用作回调函数,因此对它的引用会传递给另一个程序集:
Func<string, object, string> dostuff
Run Code Online (Sandbox Code Playgroud)
现在以原始形式,我可以调用它而不指定第二个参数,默认为null.但是当我在第二个程序集中使用它作为回调时,我必须指定第二个参数.
什么语法允许我忽略第二个参数?
我正在使用moment.js.
相对过去几天的默认值是"5 days ago".但我想要的是,如果它在一周前它应该返回"5 days ago (Tue)".如果超过一周,我想要常规"5 days ago".
文档说我可以提供一个函数来自定义格式这样的东西:
moment.locale('en', {
relativeTime : {
future: "in %s",
past: "%s ago",
s: "seconds",
m: "a minute",
mm: "%d minutes",
h: "an hour",
hh: "%d hours",
//d: "a day", // this is the default
d: function(num, noSuffix, key, future) { return "a day (" + FOO + ")"; },
//dd: "%d days", // this is the default
dd: function(num, noSuffix, key, future) { return …Run Code Online (Sandbox Code Playgroud) 该示例标识项目使用该注销:
@if (Request.IsAuthenticated) {
using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })) {
@Html.AntiForgeryToken()
<ul class="nav navbar-nav navbar-right">
<li>@Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })</li>
<li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
</ul>
}
}
Run Code Online (Sandbox Code Playgroud)
而AccountController.LogOff()动作方法有一个[HttpPost].
我可以想到使用POST而不是GET的唯一原因是[ValidateAntiForgeryToken].我没有看到这个目的,我们所做的就是退出.
当然这有点矫枉过正?为什么不使用常规的GET链接?
我需要模仿EF的DbContext.我在这里使用这种方法,效果很好.
// mock a DbSet
var mockDbSet = Substitute.For<DbSet<Foo>, IQueryable<Foo>>();
var data = new List<Foo>().AsQueryable();
((IQueryable<Foo>)mockDbSet).Provider.Returns(data.Provider);
((IQueryable<Foo>)mockDbSet).Expression.Returns(data.Expression);
((IQueryable<Foo>)mockDbSet).ElementType.Returns(data.ElementType);
((IQueryable<Foo>)mockDbSet).GetEnumerator().Returns(data.GetEnumerator());
// now add it to a mock DbContext
var mockContext = Substitute.For<MyDbContextClass>();
mockContext.Set<Foo>().Returns(mockDbSet);
Run Code Online (Sandbox Code Playgroud)
然而,在某些测试中,我需要能够调用mockContext.Set<Foo>().Add(someFoo)和mockContext.Set<Foo>().Remove(otherFoo),并为潜在的添加/删除逻辑工作.
我试过这个:
mockDbSet.When(x => x.Add(Arg.Any<Foo>())).Do(x => data.Add(x.Arg<Foo>()));
Run Code Online (Sandbox Code Playgroud)
但它抛出了 Collection was modified; enumeration operation may not execute.
那么如何实现添加/删除功能呢?
我想将一个简单的共享主机ASP.NET MVC站点部署到Azure(使用免费站点选项),该站点使用Hangfire来运行计划任务.
问题是该站点仅在第一个请求时启动,因此Hangfire在此之前不会开始计划任务.使用IIS或专用VM,您可以设置"始终开启"选项以预热站点.但这在共享主机中是不可能的.
我该怎么办?我想到支付最小的虚拟机,称为"A0",并在那里放置一个ping脚本,以确保我的网站始终处于运行状态.这可行,但似乎有点矫枉过正.
还有其他好的选择吗?
asp.net ×4
asp.net-mvc ×3
c# ×3
javascript ×2
azure ×1
dbcontext ×1
dbset ×1
generics ×1
git ×1
guard-clause ×1
gulp ×1
hangfire ×1
lambda ×1
momentjs ×1
node.js ×1
nsubstitute ×1
owin ×1
razor ×1
validation ×1