我使用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和禁用他们的帐户.防范这种情况的最佳方法是什么?也许人们只应该直接使用视图中的域模型,当一个人认为该域模型持久化的每个属性都可以被用户设置,或者当一个人只是使用该域模型来显示事物时,而不是将事物保存回来数据存储?
我正在向.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 文本生成目标的更好地方吗?
看来Microsoft确实在尝试使用.NET Core来简化DI,但我不确定为什么,但是坦率地说,我的控制台应用程序又小又简单,我只是不想为构建一个完整的DI容器而已。做一些简单的日志记录。如何在不使用DI的情况下登录.NET Core?我读过的所有内容都假定您将使用.NET Core的内置日志记录体系结构,该体系结构显然需要DI,但是必须有一种方法可以在类上不使用静态变量的情况下不进行DI?
我希望摆脱很多我回购协议的旧历史,所以我做了一个浅表克隆以仅获取最后的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次提交作为新仓库中的唯一提交?
我正在使用 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')上渲染“脚本”部分的位置?
在 Visual Studio 2022 调试会话期间,我使用源链接和 Microsoft 符号服务器调试一些 ASP.NET 内部代码,但我无法查看变量,因为它已被优化掉;但是,Quickview 有一个“禁用托管优化并重新启动调试”的选项。我选择了这个,重新启动调试,并且我确实能够查看该变量。然而,我现在担心我已经禁用了一些优化,这可能会减慢速度,而且我不清楚选择该选项实际上会改变什么。Visual Studio 中的哪些设置会发生变化?如何重新启用托管优化?
以下是该选项在 UI 下拉列表中以及单击时的外观的一些屏幕截图:
我试图查看我项目历史中的每一个变更集...至少是最后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; 为什么?我怎么能强迫他们出现?
我有一个实用程序函数来检查变量是否为空或未定义,如果通过检查,我希望 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?
这有效:
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一个可选参数,这与在末尾不指定该参数相同。
我正在尝试为 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’标头。”)。我在这里缺少什么?
asp.net-core ×3
c# ×3
asp.net-mvc ×2
javascript ×2
typescript ×2
asp.net ×1
changeset ×1
cors ×1
debugging ×1
git ×1
logging ×1
msbuild ×1
narrowing ×1
razor ×1
templating ×1
tfs ×1