布局有这个:
<!DOCTYPE html>
<html>
<head>
<environment names="Development">@RenderSection("devCss", required: false)</environment>
<environment names="Staging,Production">@RenderSection("staproCss", required: false)</environment>
</head>
<body>
@RenderBody()
<environment names="Development">@RenderSection("devJs", required: false)</environment>
<environment names="Staging,Production">@RenderSection("staproJs", required: false)</environment>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
视图有这个:
@section devCss { <link rel="stylesheet" href="foo.css" asp-append-version="true" /> }
@section staproCss { <link rel="stylesheet" href="foo.min.css" asp-append-version="true" /> }
@section devJs {}
@section staproJs {}
<h1>hello</h1>
Run Code Online (Sandbox Code Playgroud)
当标签RenderSection()
外时<environment>
,一切正常。
在内部时,如上例所示,它失败并显示无用的错误 InvalidOperationException: The following sections have been defined but have not been rendered by the page at '_Layout.cshtml': 'staproCss, staproJs'. To ignore an …
我有这些迁移:
00000000000000_First
20161101000000_Foo
20161102000000_Bar
// ...many many MANY more
20161108000000_Baz
Run Code Online (Sandbox Code Playgroud)
我想从整合Foo
到Baz
到一个新的迁移.我知道如何在EF中这样做,但在EF Core中不知道.
我试过这个:
dotnet ef update database 00000000000000_First
// delete all other migration classes
dotnet ef migrations add Consolidated
dotnet ef update
Run Code Online (Sandbox Code Playgroud)
我希望新Consolidated
迁移将包含对模型的所有更改.但它Up()
和Down()
方法都是空的.
我究竟做错了什么?
我正在使用ASP.NET Core.我的一个控制器调用服务,抛出各种异常.我想在异常过滤器(而不是中间件)中处理它们.
public class MyHandlerAttribute : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext c)
{
if (c.Exception is FooException) {
// redirect with arguments to here
}
else if (c.Exception is FooException) {
// redirect with arguments to there
}
else {
// redirect to main error action without arguments, as 500
}
base.OnException(c);
}
}
Run Code Online (Sandbox Code Playgroud)
与动作过滤器不同,异常过滤器不会让我访问Controller
,所以我不能这样做c.Result = controller.RedirectTo...()
.
那么如何重定向到我的错误操作?
我正在将项目转换为ASP.NET Core.我需要迁移大量可重用的html帮助程序,但Core中不存在html帮助程序.
有些很复杂,有些简单.这是一个非常简单的例子:
@helper EditIcon()
{
<i class="glyphicon glyphicon-pencil"></i>
}
Run Code Online (Sandbox Code Playgroud)
请注意,这只是一个例子.
Point正在编写一个标记助手,因为这是一种巨大的过度杀伤力.部分相同.视图组件也是如此.
我们谈论的是Razor的一小部分内容.什么是我最好的选择?
ASP.NET 核心。
<label asp-for="FooModelProperty">...</label>
Run Code Online (Sandbox Code Playgroud)
这会生成一个具有适当属性名称的表单控件。选择、输入等也是如此。
但我需要在某个随机元素上使用该名称,例如 a div
,这样我就可以在 JavaScript 中使用它。问题是asp-for
标签助手不适用于任意元素。
那么我该怎么做这样的事情:
<div asp-for="FooModelProperty">...</div>
Run Code Online (Sandbox Code Playgroud) 我的实体有一个允许为null的属性.但是,如果它不为null,那么它必须是唯一的.换句话说,该列是唯一的但允许多个空值.
我试过了:
config.Property(p => p.ProductId).IsRequired(false);
Run Code Online (Sandbox Code Playgroud)
我记得在前核心EF中努力工作.
这可能吗?如何配置实体?
在 ASP.NET Core 中,EF Core 上下文是由内置 DI 容器创建的。在官方文档中,上下文是使用泛型创建的DbContextOptions<TContext>
:
public class MyContext : IdentityDbContext<User> {
public MyContext(DbContextOptions<MyContext> options, ILogger<MyContext) logger) : base(options) { }
}
Run Code Online (Sandbox Code Playgroud)
然而,也有一些非泛型的例子:
public class MyContext : IdentityDbContext<User> {
public MyContext(DbContextOptions options, ILogger<MyContext) logger) : base(options) { }
}
Run Code Online (Sandbox Code Playgroud)
从源码来看它们的区别是:
类型参数: TContext:这些选项适用的上下文的类型。
我想使用非泛型类型,因为在我的设计中我有一个抽象上下文,这与 DI 容器不能很好地配合。
那么,如果我使用非泛型类型,这到底意味着什么?我的上下文无法正确配置?
我正在使用 ASP.NET Core 和 Autofac。几乎所有内容都是按照生命周期范围(“每个请求”)注册的。所以我的数据库上下文DbContext
在整个请求中是同一个实例。
不过我有一个单例,它也依赖于DbContext
. 为了避免强制依赖,它被注入为,这意味着每次都有Func<Owned<DbContext>>
一个新实例。DbContext
问题是我需要与请求期间其他地方相同的实例,而不是新的实例。
我想避免强制依赖错误,但我也想要相同的实例。可以通过标记或自定义注册实现这一点吗?
ASP.NET Core的"选项"服务有很多变化.我正在使用最新版本,并且没有任何教程和示例工作了.
为了简单起见,我使用Visual Studio的模板创建了一个新的ASP.NET Core Web应用程序.
我的appsettings.json
包含:
"MyConfig": {
"Foo": "Bar"
}
Run Code Online (Sandbox Code Playgroud)
我的强类型配置对象:
public class MyConfig {
public string Foo;
}
Run Code Online (Sandbox Code Playgroud)
我的Startup.ConfigureServices
包含:
services.AddOptions();
services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
//services.Configure<MyConfig>(opts => Configuration.GetSection("MyConfig").Bind(opts)); // I also tried this
Run Code Online (Sandbox Code Playgroud)
我的HomeController
包含:
public class HomeController : Controller {
private readonly MyConfig _myConfig;
public HomeController(IOptions<MyConfig> myConfig) {
_myConfig = myConfig.Value;
}
public IActionResult Index() {
return Content(_myConfig.Foo); // Foo is null
}
}
Run Code Online (Sandbox Code Playgroud)
我的project.json
包含:
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0", …
Run Code Online (Sandbox Code Playgroud) EF Core支持显式加载。上下文有两个重载,一个重载,一个重载。
有两种方法是没有用的,并且会变得混乱。我想要一个接受两个都作为参数数组的方法。
所以代替这个
await context.Entry(customer).Collection(e => e.Orders).LoadAsync();
await context.Entry(customer).Collection(e => e.Returns).LoadAsync();
await context.Entry(customer).Reference(e => e.Account).LoadAsync();
Run Code Online (Sandbox Code Playgroud)
我想做这个:
await context.Entry(customer).Load(e=>e.Orders, e=>e.Returns, e=>e.Account);
Run Code Online (Sandbox Code Playgroud)
我认为这是可行的,因为有一些类似的东西context.Include(...)
可以同时接受集合和引用。
到目前为止,在我的上下文类中:
public async Task Load<TEntity>(TEntity entity, params Expression<Func<TEntity, object>>[] propertyExpressions)
where TEntity : class
{
foreach (var propertyExpression in propertyExpressions) {
var isCollection = typeof(IEnumerable).GetTypeInfo()
.IsAssignableFrom(propertyExpression.Body.Type);
if(isCollection)
{
await Entry(entity)
.Collection(propertyExpression) // problem is here !!!!!
.LoadAsync();
}
else
{
await Entry(entity)
.Reference(propertyExpression)
.LoadAsync();
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题行显示在上方。输入是object
但是.Collection()
期望的IEnumerable<TProperty>
。 …
c# ×9
asp.net-core ×7
asp.net ×4
razor ×2
tag-helpers ×2
.net-core ×1
autofac ×1
html-helper ×1
lambda ×1
reflection ×1