在默认的 Blazor 项目中,我们获取Pages/_Host.cshtml包含应用程序 HTML 模板之类内容的文件。
最近,我创建了我的第一个 Razor 组件库 (RCL),并且它可以工作。这是它的脚本部分:
<script src="_content/Woof.Blazor/js/woof.js"></script>
<script src="_content/Woof.Blazor/js/modal.js"></script>
<script src="_content/Woof.Blazor/js/input.js"></script>
<script src="_content/Woof.Blazor/js/datatable.js"></script>
<script src="_content/Woof.Blazor/js/autocomplete.js"></script>
Run Code Online (Sandbox Code Playgroud)
这些脚本手动包含在我的应用程序中。图书馆有没有办法自动将这些文件添加到应用程序模板中?顺便说一句,如果样式表也可以自动添加,那就太好了。
编辑:我只是尝试创建一个_Scripts.cshtml文件,但没有成功。Visual Studio 显示了很多奇怪的错误,可能是由于缺少包引起的,但我不知道。使脚本部分成为局部视图?它实际上并不是 MVC 的一部分。所以可能我错了。
我想要实现的是将上面的整个脚本部分替换为一行,包括我的库中的所有预定义和预配置的脚本。
我有自定义浏览器类,它能够根据浏览的页面状态触发大量事件.现在我需要使用我的浏览器在这个网页上执行一些操作,但是它们必须按顺序运行,每个操作都需要前一个操作的数据.实现这一目标的最简单方法是使同步方法等待浏览器完成其工作.我这样做了:
public incomplete class MyClass {
// (...) lots of stuff comes here, it's a web browser :)
public bool MySyncMethod(object data) {
bool success = false;
bool wait = true;
MyEventHandler = new EventHandler((o, e) => {
data = MyEventProvidedData; // belive me, it's threre when it fired
success = true; // let's assume it always succeed
wait = false; // now we can move on to the rest of our long chain
});
// (...) here I have …Run Code Online (Sandbox Code Playgroud) 我有一个输入元素。keydown我在使用 JavaScript和事件输入时添加了一些过滤和修改文本的功能keypress。
例如 - 当输入接受大写字符时,当您仅按“a”(无shift,无大写锁定)时,您会得到“A”。
这是可行的,但是输入值绑定根本不起作用。我只是调用preventDefault()JS 事件,就这样,绑定被破坏了。
我尝试自己调度该事件。我发送了新创建的KeyboardEvent并且CustomEvent类型为“change”的。什么都不起作用。我可以修改 JS 事件处理程序中的输入值,我可以在浏览器中看到更改,但我的 C# 却看不到。
我怎样才能做到这一点?我是否必须手动调用 C# 来更新绑定,还是有其他方法?
该代码应仅在最新的 Chrome / Firefox 浏览器上运行,较旧的浏览器可能不受支持。
我正在寻找一种TypeScript解析器,该解析器从TypeScript代码生成AST(抽象语法树),例如使用Visual Studio创建的代码。
我认为Visual Studio必须具有这样的解析器,因为它将其用于代码智能。
我知道我可以将TS编译为JS,然后像Jint一样使用AST,但是这对我没有好处。我需要在AST节点和TS源中的原始行之间建立严格的关系。
有没有办法将我的手放在VS / Windows dll上以获取AST,或者也许有一个提供此类功能的库?我进行了一些研究,发现所有内容都不完整且有限。
有一个用TypeScript编写的Microsoft TypeScript编译器,但是如何从C#中使用它呢?实时分析编辑后的代码是否足够快?
为了澄清起见:我需要使用C#或具有C#绑定的C ++编写的解析器。或者...好吧,它可以用任何语言编写,但可以从C#代码级别进行访问。恐怕我必须编写自己的解析器,但是我不想重蹈覆辙。
关键是我想可视化代码。我不希望从C#执行代码。我只想看看它的结构,它必须准确无误。
我见过的大多数解析器/编译器仅出于执行脚本的目的而编写了数千个LOC。它们涵盖了语言语法的非常有限的子集。我只需要相反。没有运行,但是语法完整。没有控制结构,它们与我的可视化无关。我需要AST提供的所有功能声明和对象定义声明。
我知道几乎所有可以想象的用JavaScript编写的语言都有一个解析器/编译器,但是用C#编写的代码有什么好处吗?
我有一个使用Visual Studio制作并测试过的项目。有用。然后我将其上传到Ubuntu服务器。然后运行dotnet run。可以,远程计算机可以看到它(通过nginx代理)。
然后我尝试了dotnet run &。该过程似乎已经开始,但是没有任何监听指定的端口。然后,根据示例,我尝试了sudo nohup dotnet run kestrel > /dev/null 2>&1 &。这次它听了一段时间,然后死于:
应用程序已启动。按Ctrl + C关闭。
失败:Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [0]发生未处理的异常:找不到软件包“ google.protobuf”的编译库位置System.InvalidOperationException:找不到Microsoft软件包“ google.protobuf”的编译库位置.Extensions.DependencyModel.CompilationLibrary.ResolveReferencePaths()
(nohup.out的输出片段,第一批亚麻布,我跳过了无关紧要和私有的项目详细信息)。
有什么线索吗?在前台运行它时,我仍然没有任何错误。
我发现的结果是:当我以root身份运行它时,我无法运行它(给出相同的错误消息)。在我的测试服务器上,我有一个名为“ dotnet”的特殊用户帐户。登录后dotnet即可运行该应用程序。作为根,我不能。
我不想使用root特权运行我的应用程序。
下一步尝试:我dotnet restore以root身份运行。然后我去了nohup dotnet run kestrel > /dev/null 2>&1 &,它起作用了。
真好 现在有没有办法以有限的权限启动我的应用程序?
目标:对未经测试的外部代码执行超时.如果我的应用程序会导致另一方冻结,我想立即知道.让我们说这是非常复杂的单元测试.如果测试客户端使用我的应用程序并在500毫秒内返回 - 它已通过,如果没有 - 它失败了.
所以,是的,我不会对客户端温和,这是一个崩溃测试网站.我等了500ms,然后我不在乎客户端等待什么,我想立即将它与异常崩溃,但那么报告它作为测试结果.
可能是许多测试结果之一.
那么,现在,这里,代码:
Console.Write("Testing");
try {
for (int j = 0; j < 3; j++) {
Console.Write(".");
for (int i = 0; i < 256; i++) {
using (var cts = new CancellationTokenSource(500)) {
var token = cts.Token;
token.Register(() => throw new TimeoutException("FREEZE DETECTED"));
clients.Add(LDSCheckAsync().Result);
}
}
clients.ForEach(i => i.Dispose());
clients.Clear();
}
Console.WriteLine("OK.");
}
catch {
clients.ForEach(i => i?.Dispose());
Console.WriteLine("FAIL!");
}
Run Code Online (Sandbox Code Playgroud)
我设计的测试失败了.但我没有得到"失败"的消息,我得到了UNHANDLED EXCEPTION.
为什么,以及如何正确地做到这一点.在你尝试写评论之前,请真的考虑我不能IfCancellationRequested在这里使用或类似的东西.测试下的功能通常会立即退出,但由于某些网络错误,它可以进入30秒冻结.当它发生时我完全不知道,为什么更为未知.我做的测试应该帮助我诊断它.冻结不能取消.我知道.我想要的是将冻结转换为一个很好的捕获异常,然后捕获它,然后记录它.但是当try/ catch没有按预期工作时(是的,甚至在VS之外),我很无奈.
既然回答了......
我做了一个方便的工具,以便下次我需要测试冻结代码时让我的生活变得更轻松:
using System.Threading;
using …Run Code Online (Sandbox Code Playgroud) IJSRuntime.InvokeVoidAsync()被称为代码路径中的最后一件事会导致 CA2012(正确使用 ValueTasks)警告。可以安全地忽略它,还是应该通过等待来解决它?
当我.Preserve()在同步调用结束时添加警告消失,代码工作相同。这是为什么?发生什么了?这个方法有什么作用?(Preserve()方法的)文档不清楚。
我想要“即发即忘”使用返回ValueTask. 从同步方法调用它的最正确方法是什么?
添加一些上下文 - 我从 Blazor 代码执行 JS。我不依赖调用后JS代码引起的效果。这就是为什么我不等待它。我可以重构我的代码以等待,ValueTask但除了让代码分析器满意之外,它还有其他用途吗?
是否可以?如何?
我有一个异步方法从数据库中获取数据行。我的结果是IAsyncEnumerable<TItem>. 它应该是快速响应 UI 的完美数据类型,但是,当我将其设置为网格的数据源时,它不起作用并且不显示任何内容。
我对此有两个解决方法。首先显然是从我的异步任务返回数组。第二个是类似的 - 我可以只使用ToArrayAsync()结果(来自System.Linq.Async)。
我怀疑使用ToArrayAsync()比仅从任务返回数组慢,所以它没有多大意义。
IAsyncEnumerable如果类型可以直接用作控件的数据源,那就很有意义了。但随后我可能需要实现某种IObservable接口或类似的东西。有人试过这个吗?
整个事情是相当新的,我找不到任何例子,甚至找不到一篇文章表明这是可能的。我的意思是 -IAsyncEnumerable如果你不能将它用于 UI 有什么好处?
IAsyncEnumerable<TItem>更新:我正在寻找的是和之间的转换ObservableCollection<TItem>。我找到了示例,但它们的工作方式与我提到的解决方法完全相同 - 因此数据被放入数组中,然后添加到集合中。这破坏了所有IAsyncEnumerable<T>好处。
示例代码:
const string UtcTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffZ";
public byte[] UtcTimeAscii => Encoding.ASCII.GetBytes(DateTime.UtcNow.ToString(UtcTimeFormat));
Run Code Online (Sandbox Code Playgroud)
这是我得到的属性 IL Length:(使用MicroscopeVS 添加)

现在:为什么有一个系统调用而不是简单的24?这是一个常量字符串。有没有办法告诉编译器它是提前知道的?
我知道,我可以定义24为const int,但这是不对的,因为实际字符串与其长度之间没有直接绑定。当然我可以调用Length(),但我只是好奇,也许有特殊的语法来使用这种优化?
我还将配置从 切换Debug到Release但系统调用仍然存在。
我有一个剃须刀组件。该组件有一个参数,EventCallback准确地说,名为“ValueChanged”。
[Parameter]
public EventCallback<string> ValueChanged { get; set; }
Run Code Online (Sandbox Code Playgroud)
我在一个剃刀文件中准确地提到了这个事件,如下所示:
<Autocomplete DataSource="@Data" Columns="Id,Name" ValueChanged="OnUnitBrandIdChanged" />
Run Code Online (Sandbox Code Playgroud)
我将属性名称重命名(通过 F2,AKA 重构)为“OnValueChanged”。razor 文件没有自动更新(我猜是 Visual Studio 中的一个错误)。所以我手动更新了它。所以现在两个兴趣点看起来像这样:
[Parameter]
public EventCallback<string> OnValueChanged { get; set; }
Run Code Online (Sandbox Code Playgroud)
和
<Autocomplete DataSource="@Data" Columns="Id,Name" OnValueChanged="OnUnitBrandIdChanged" />
Run Code Online (Sandbox Code Playgroud)
代码编译并运行,然后运行时崩溃并显示以下错误消息
未处理的异常呈现组件:“Woof.Blazor.Components.Autocomplete”类型的对象没有与名称“ValueChanged”匹配的属性。
我浪费了 4 个小时调查这个案子。首先,我将名称“OnValueChanged”更改为“SomethingElse”——以确保我的源代码中根本不存在字符串“ValueChanged”。当然,我收到相同的错误消息。
然后我搜索了项目中的所有文件,包括字符串“ValueChanged”的隐藏文件和二进制文件。当然,我在obj,bin和.vs目录中找到了字符串。所以我删除了那些文件。
再次编译代码后,我收到相同的错误消息。带有“ValueChanged”参考的那个。
我创建了全新的 Blazor 项目。我复制了我所有的代码文件,三重检查它们都没有包含“ValueChanged”字符串。
当新项目运行时 - 我收到相同的错误消息。
我想也许 Visual Studio 已经在隐藏位置的项目目录外的文件中写入了引用。所以我从项目中删除了所有临时文件,将其发布在 GitHub 上并发送给我的同事。他克隆了该项目,运行它并收到相同的错误消息。
我创建了名为“ValueChanged”的属性,虚拟属性,object类型。完全未使用和冗余。当然程序运行没有错误。
似乎对该名称的引用隐藏在某处,但我不知道在哪里。没有 Windows 工具能够在项目目录中搜索“ValueChanged”字符串。我什至怀疑 Visual Studio 可以通过加密和/或压缩内容来隐藏引用,但我再次三重检查我删除了所有二进制文件,所有非纯文本文件。
一无所有。
然后我创建了全新的 Blazor 项目。创建了一个测试组件,创建了一个事件,绑定了虚拟事件处理程序,编译并运行。一切正常。然后我以与原始程序完全相同的方式重构了我的测试程序。它有效,完全没有问题。我什至使用了完全相同的名称、类型、目录结构、命名空间,我什至添加了名为“Value”的参数,以使我的测试用例更类似于生产代码。结果是新项目正常运行。我可以重命名任何参数,它就可以工作。
我的旧项目即使几乎从头开始重写而没有在任何文件中出现字符串“ValueChanged”,也不会正常运行。同样的错误信息。与 Visual Studio 和 …
c# ×7
blazor ×4
.net ×3
.net-5 ×1
.net-core ×1
asp.net-core ×1
async-await ×1
cil ×1
controls ×1
events ×1
javascript ×1
optimization ×1
parsing ×1
typescript ×1
unit-testing ×1
wpf ×1