我试图制作一个表,列出两种类型的链接在一起的文件。一种是.mp3,另一种是.txt文件。我希望这些文件链接在一起,这样当foreach循环通过它们时,共享相同名称的文件共享一行。这样可以播放mp3文件,并打开相应的文本文件。
App.razor页面有一个表,显示了文件夹中的所有文件,但它没有考虑两种类型的文件是否共享相同的名称。有人能帮助如何创建一个类,将文件链接在一起,以便在表中调用它们吗?
下面是代码。
<table class="table table-striped mb-0">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
@foreach (var fileGroup in myFilesGroupedAndSorted)
{
<Mp3 FileGroup=fileGroup />
}
</tbody>
</table>
@code {
readonly List<TextFile> textList = new();
private string audioUrl { get; set; }
readonly string audioFolderName = "textFiles";
protected override void OnInitialized()
{
var path = $"{env.WebRootPath}\\{audioFolderName}\\"; //System.IO.Path.ChangeExtension(@"wwwroot\textFiles\", null);
var files = new DirectoryInfo(path).GetFiles();
foreach (var file in files)
{
textList.Add(new TextFile
{
Name = file.Name,
Url = $"/textFiles/{file.Name}",
Path = file.FullName
});
}
}
IEnumerable<IGrouping<string, TextFile>> myFilesGroupedAndSorted
=> textList.GroupBy(file => GetPathWithoutExtension(file.Path))
.OrderBy(group => group.Key);
private string GetPathWithoutExtension(string path)
{
return System.IO.Path.ChangeExtension(path, null);
}
}
Mp3.razor
<tr>
<td>
@FileGroup.Key
</td>
<td>
@if (Mp3 is not null)
{
<span @onclick="() => PlayAudio(Mp3.Url)"
class="text-primary oi oi-play-circle me-2" aria-hidden="true" role="button">
</span>
}
@if (Text is not null)
{
<span @onclick="() => openTextFile(Text)">
<button>Open</button>
</span>
}
</td>
</tr>
@code {
readonly List<TextFile> textList = new();
private string audioUrl { get; set; }
[Parameter]
public IGrouping<string, TextFile> FileGroup { get; set; } = default!;
TextFile? Text => FileGroup.FirstOrDefault(file => Path.GetExtension(file.Path).ToLower() == "txt");
TextFile? Mp3 => FileGroup.FirstOrDefault(file => Path.GetExtension(file.Path).ToLower() == "mp3");
private void PlayAudio(string url)
{
audioUrl = url;
InvokeAsync(StateHasChanged);
}
private async Task DeleteAudio(TextFile text)
{
...
}
public void openTextFile(TextFile text)
{
...
}
}
如果我删除TextFile? Text => fileGroup.FirstOrDefault(file => Path.GetExtension(file.Path).ToLower() == "txt");
和TextFile? Mp3 => fileGroup.FirstOrDefault(file => Path.GetExtension(file.Path).ToLower() == "mp3");
以及它们在表中的提及,它的功能。
@using System.Linq
@inject IWebHostEnvironment env
<table class="table table-striped mb-0">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
@foreach (var fileGroup in myFilesGroupedAndSorted)
{
<tr>
<td>
@fileGroup.Key
</td>
<td>
@if (Mp3 is not null)
{
<span @onclick="() => PlayAudio(Mp3.Url)"
class="text-primary oi oi-play-circle me-2" aria-hidden="true" role="button">
</span>
}
@if (Text is not null)
{
<span @onclick="() => openTextFile(Text)"
><button>Open</button>
</span>
}
</td>
</tr>
}
</tbody>
</table>
@code {
List<TextFile> textList = new();
readonly string audioFolderName = "textFiles";
public IGrouping<string, TextFile> fileGroup { get; set; } = default!;
TextFile? Text => fileGroup.FirstOrDefault(file => Path.GetExtension(file.Path).ToLower() == "txt");
TextFile? Mp3 => fileGroup.FirstOrDefault(file => Path.GetExtension(file.Path).ToLower() == "mp3");
protected override void OnInitialized()
{
var path = $"{env.WebRootPath}\\{audioFolderName}\\";
var files = new DirectoryInfo(path).GetFiles();
foreach (var file in files)
{
textList.Add(new TextFile
{
Name = file.Name,
Url = $"/textFiles/{file.Name}",
Path = file.FullName
});
}
}
IEnumerable<IGrouping<string, TextFile>> myFilesGroupedAndSorted
=> textList.GroupBy(file => GetPathWithoutExtension(file.Path))
.OrderBy(group => group.Key);
private string GetPathWithoutExtension(string path)
{
return System.IO.Path.ChangeExtension(path, null);
}
private string audioUrl { get; set; }
private void PlayAudio(string url)
{
audioUrl = url;
InvokeAsync(StateHasChanged);
}
List<EditTextFiles> items = new();
public void openTextFile(TextFile text){ }
}
2条答案
按热度按时间46scxncf1#
使用
Linq
的GroupBy
通过测试每个文件扩展名,处理每个组应该是微不足道的。我会做一个子组件来传递
IGrouping<string, TextFile>
作为参数,以简化逻辑...Mp3.Razor
第一次
oyxsuwqo2#
你需要“透视”表,也就是说,把一个列表转换成一个表。LINQ可以用来做这个。看看this answer。你会有属性
bool HasMp3
和bool HasTxt
,而不是“Jan”和“Feb”,以及相应的Where
子句。类似于:使用这两个bool属性,您可以在相应文件不存在时隐藏按钮。
Url
属性没有扩展名。您必须在每个相应函数中附加每个相应的扩展名。