小编Jez*_*Jez的帖子

视图直接使用域模型是否危险?

我使用EF代码优先方法来定义我的数据库结构.目前,我将EF实体类直接传递给MVC应用程序中的一些视图.这样可以很容易地填充和保存视图,因为我可以直接拥有一个存储库,为我提供填充的EF类,如果我的控制器在回发中收到EF实体类,我可以(如果验证可以)直接通过到存储库来保存它.但是,这可能存在安全隐患吗?如果实体类中有属性我不想修改,客户端是否可以将这些属性作为回发的一部分提交并修改它们?例如,假设我有一个视图来编辑我传递此EF模型的用户:

public class User {
    [Required]
    public string Firstname { get; set; }
    [Required]
    public string Surname { get; set; }
    public DateTime DOB { get; set; }
    public bool IsDisabled { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我可能会公开Firstname,Surname并且DOB作为可编辑的表单字段,但我不希望用户能够设置IsDisabled和禁用他们的帐户.防范这种情况的最佳方法是什么?也许人们只应该直接使用视图中的域模型,当一个人认为该域模型持久化的每个属性都可以被用户设置,或者当一个人只是使​​用该域模型来显示事物时,而不是将事物保存回来数据存储?

asp.net-mvc entity-framework

4
推荐指数
2
解决办法
149
查看次数

在 CoreBuild 之前运行目标?

我正在向.tt我的项目中添加一个自定义模板生成目标以运行 before CoreBuild,并且似乎有两种方法可以做到:

<Project...>
    <Target Name="TransformOnBuild" AfterTargets="BeforeBuild">
</Project>
Run Code Online (Sandbox Code Playgroud)

<Project...>
    <Target Name="TransformOnBuild" BeforeTargets="CoreBuild">
</Project>
Run Code Online (Sandbox Code Playgroud)

如果我的目标应该在我的项目构建之前运行,因为项目依赖于它,我使用后者会更好吗?我见过前者用来做诸如生成文本模板之类的事情,但这似乎是一种不可靠的方法,因为它可能会在 之后运行CoreBuild,这为时已晚。或者有什么理由为什么AfterTargets="BeforeBuild"仍然保证在核心构建之前运行?

我还看到BeforeTargets="BeforeBuild"哪个会更早构建。这是放置`.tt 文本生成目标的更好地方吗?

msbuild visual-studio

4
推荐指数
2
解决办法
3431
查看次数

登录没有.DI的.NET Core?

看来Microsoft确实在尝试使用.NET Core来简化DI,但我不确定为什么,但是坦率地说,我的控制台应用程序又小又简单,我只是不想为构建一个完整的DI容器而已。做一些简单的日志记录。如何在不使用DI的情况下登录.NET Core?我读过的所有内容都假定您将使用.NET Core的内置日志记录体系结构,该体系结构显然需要DI,但是必须有一种方法可以在类上不使用静态变量的情况下不进行DI?

c# logging asp.net-core

4
推荐指数
3
解决办法
1349
查看次数

如何将浅表克隆推到新的仓库?

我希望摆脱很多我回购协议的旧历史,所以我做了一个浅表克隆以仅获取最后的50次提交:

git clone --depth=50 https://my.repo
Run Code Online (Sandbox Code Playgroud)

那行得通,但是当我创建一个新的Gitlab存储库并尝试将其推送时,出现错误:

git remote remove origin
git remote add origin https://my.repo
git push -u origin --all
[...]
 ! [remote rejected] master -> master (shallow update not allowed)
Run Code Online (Sandbox Code Playgroud)

但是我只希望这50次提交成为我的新仓库的历史记录。我怎么能告诉git它应该只将这50次提交作为新仓库中的唯一提交?

git

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

为什么我的 Razor 'RenderSection' 没有被孙视图继承?

我正在使用 Razor 视图的层次结构设置我的 ASP.NET Core 站点,如下所示:

_Layout
    _PanelLayout
        Index
Run Code Online (Sandbox Code Playgroud)

所以,我有这些文件:


_ViewStart.cshtml

@{
    Layout = "_PanelLayout";
}
Run Code Online (Sandbox Code Playgroud)

_PanelLayout.cshtml

@{
    Layout = "_Layout";
}
<div>Panel layout file</div>
@RenderBody()
Run Code Online (Sandbox Code Playgroud)

_Layout.cshtml

<html><body>
    <div>Main layout file</div>
    @RenderBody()
    @RenderSection("scripts", required: false)
</body></html>
Run Code Online (Sandbox Code Playgroud)

索引.cshtml

@section scripts {
    <script>
        // test script
    </script>
}
<div>Content view</div>
Run Code Online (Sandbox Code Playgroud)

当我运行返回Index视图的控制器操作时,出现错误:

InvalidOperationException:以下部分已定义但尚未由“_PanelLayout.cshtml”处的页面呈现:“脚本”。

为什么 Razor 没有发现 Index 的祖父视图正在呈现“脚本”部分的事实?如果我删除该部分,布局工作正常,所以唯一的问题是该部分渲染不会延续到祖父布局。这个问题是否有解决方案仍然允许我决定在祖父布局('_Layout')而不是父布局('_PanelLayout')上渲染“脚本”部分的位置?

c# asp.net-mvc templating razor asp.net-core

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

Visual Studio 中的“禁用托管优化并重新启动调试”实际更改了哪些设置?

在 Visual Studio 2022 调试会话期间,我使用源链接和 Microsoft 符号服务器调试一些 ASP.NET 内部代码,但我无法查看变量,因为它已被优化掉;但是,Quickview 有一个“禁用托管优化并重新启动调试”的选项。我选择了这个,重新启动调试,并且我确实能够查看该变量。然而,我现在担心我已经禁用了一些优化,这可能会减慢速度,而且我不清楚选择该选项实际上会改变什么。Visual Studio 中的哪些设置会发生变化?如何重新启用托管优化?

以下是该选项在 UI 下拉列表中以及单击时的外观的一些屏幕截图:

落下

点击后

asp.net debugging visual-studio-2022

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

查看每个TFS变更集?

我试图查看我项目历史中的每一个变更集...至少是最后1000个变量集.所以我运行了命令:

tf history $/MyProject /recursive /format:brief
Run Code Online (Sandbox Code Playgroud)

...在VS命令行.这会在MyProject项目中弹出一个包含大多数变更集的历史窗口,但即便在这里也会丢失奇怪的变更集.例如,变更集ID列表为:3956 3955 3954 3953 3952 3949 3948 3947 [...]

未显示变更集3950-3951; 为什么?我怎么能强迫他们出现?

tfs changeset source-control-explorer visual-studio

2
推荐指数
1
解决办法
622
查看次数

我可以在 TypeScript 中缩小范围吗?

我有一个实用程序函数来检查变量是否为空或未定义,如果通过检查,我希望 TypeScript 缩小输入变量的范围,例如:

public init(input?: string): void {
    function isSpecified(input: any): boolean {
        return (typeof input !== "undefined") && (input !== null);
    }

    if (isSpecified(input)) {
        let copiedString: string = input; // <-- Error; input is still 'string | undefined'
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的, TS 并没有消除字符串的可能性,undefined即使该函数在逻辑上是不可能的。有没有办法让这个函数调用缩小块input内的范围if

javascript narrowing typescript type-narrowing

2
推荐指数
1
解决办法
247
查看次数

为什么TypeScript在必需参数之后需要可选参数?

这有效:

public console(message: string | undefined, suppressLevel: boolean) {}
Run Code Online (Sandbox Code Playgroud)

但这不是:

public console(message?: string, suppressLevel: boolean) {}
Run Code Online (Sandbox Code Playgroud)

考虑到这?似乎基本上是一种简写| undefined(当您将鼠标悬停在VS Code中时,它就是这么说的),为什么TypeScript会与众不同?您可以显式传递undefined一个可选参数,这与在末尾不指定该参数相同。

javascript typescript

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

无法为面向 netcoreapp3.0 的 ASP.NET Core WebApp 中的特定 API 控制器启用 CORS

我正在尝试为 ASP.NET Core 应用程序中的特定 API 控制器启用 CORS。首先,我安装 NuGet 包,并将其添加到我的.csproj

<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />
Run Code Online (Sandbox Code Playgroud)

然后,我在我的中添加以下内容ConfigureServices

services.AddCors(options => {
    options.AddPolicy("AllowAll", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
});
Run Code Online (Sandbox Code Playgroud)

之后,如果我将其添加到 my 中Configure,它会起作用:

app.UseCors("AllowAll");
Run Code Online (Sandbox Code Playgroud)

但是,这会为所有控制器启用 CORS。我只想为SessionApiController. 如果我改为添加EnableCorsAttribute到控制器:

[Route("api/session")]
[EnableCors("AllowAll")]
[ApiController]
public class SessionApiController : Controller {
    [...]

    [Route("init")]
    public JsonResult InitSession() {
        [...]
    }
}
Run Code Online (Sandbox Code Playgroud)

...它不起作用,当我尝试访问/api/session/init端点时,Chrome 给我一个 CORS 错误(“请求的资源上不存在‘Access-Control-Allow-Origin’标头。”)。我在这里缺少什么?

c# cors asp.net-core asp.net-core-3.0

2
推荐指数
1
解决办法
2983
查看次数