【问题标题】:Using ASP.NET MVC, how can I list multiple html audio players that each play a different file?使用 ASP.NET MVC,如何列出多个 html 音频播放器,每个播放器播放不同的文件?
【发布时间】:2018-12-16 20:45:30
【问题描述】:

背景

我一直在从事一个个人项目,创建一个媒体播放器/组织器,该媒体播放器/组织器配备了音乐库、导入和播放列表功能,用户可以根据自己的需要自定义和添加这些功能。

问题

在这个项目中,我来到了应用程序最关键的部分,我想列出用户导入到他们的库中的所有歌曲和/或允许播放这些歌曲的播放列表。 我遇到了下面的帖子,这正是我面临的问题,但是我没有看到关于如何解决这个问题的明确解释,为什么我要创建这个帖子。

引用帖子的链接:Using .Net MVC, how can I list multiple html audio players that play different files?

我用这篇文章播放了一个音频文件,但是我仍然无法用它来播放多个。

代码

您可以在下面看到我在播放列表视图中的所有尝试,以尝试让播放列表中的所有歌曲都可以播放。似乎 foreach 循环完全跳过了音频标签,并希望在加载时呈现一个媒体播放器:

@model IEnumerable<WhizzyMediaOrganiser.Models.Playlist_Contents_MVC>

@{
    ViewBag.Title = "PlaylistContents";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>PlaylistContents</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.SongFilePath)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.HeaderId)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.SongId)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.DateAdded)
        </th>
        <th></th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @*Not worked*@
                @*<audio controls="controls" preload="auto" src="@item.SongFilePath"></audio>*@

                @*Worked but for only audio file*@
                @*<audio controls="controls" preload="auto" src="@Url.Action("MyAudio")"></audio>*@

                @*Not worked*@
                <article class="audio">
                    <audio controls>
                        <source src="@Url.Action(item.SongFilePath)" type="audio/mp3" />
                    </audio>
                </article>
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.HeaderId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.SongId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DateAdded)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
                @Html.ActionLink("Details", "Details", new { id = item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
    }

</table>

以下是支持控制器中的代码:

public class PlaylistsController : Controller
    {
        IDbRepository rep;

        public PlaylistsController(IDbRepository rep)
        {
            this.rep = rep;
        }

        public PlaylistsController()
        :this(new DbRepository()) { }

        // GET: Playlists/Details/5
        public ActionResult PlaylistContents(int id)
        {
            var dbPlaylistContents = rep.GetPlaylistContentsByHeaderId(id);

            List<Playlist_Contents_MVC> contents = new List<Playlist_Contents_MVC>();
            foreach (var item in dbPlaylistContents)
            {
                var song = rep.GetSongById(item.SONG_ID);
                var songFile = rep.GetSongFileById(song.FILE_ID);
                Playlist_Contents_MVC content = new Playlist_Contents_MVC()
                {
                    Id = id,
                    SongFilePath = songFile.FILE,
                    SongId = item.SONG_ID,
                    DateAdded = item.DATE_ADDED,
                    HeaderId = item.HEADER_ID
                };

                contents.Add(content);
            }

            return View(contents);
        }

        //Action called by single audio file attempt
        public ActionResult MyAudio()
        {
            var file = Server.MapPath("~\\SongFiles\\benny_blanco_Halsey_Khalid_–_Eastside_official_video_.mp3");
            return File(file, "audio/mp3");
        }

下面是 Playlist_Contents_MVC 模型(视图所基于的模型):

public partial class Playlist_Contents_MVC
    {
        public string SongFilePath { get; set; }
        public int Id { get; set; }
        public int SongId { get; set; }
        public int HeaderId { get; set; }
        public DateTime DateAdded { get; set; }
    }

最终目标

为了更好地传达我想要实现的目标,下面显示了一个指向图像的链接,该链接显示了播放列表标题和播放列表内容页面与播放列表功能相关。

链接:https://imgur.com/a/2gqxiMv

  • 播放列表标题页面显示所有播放列表的列表
    用户创建了详细信息按钮,将他们带到其
    内容
  • 播放列表内容页面显示播放列表中的所有歌曲 选择,我试图让用户能够暂停, 通过使用 音频标签控件(或根据需要使用其他形式的控件)

注意:应用程序远未完成,因此请忽略所有名称不佳的列等。

决赛

如果有人需要进一步说明,请告诉我,我可以详细说明,欢迎提出所有建议。

提前致谢!

【问题讨论】:

    标签: c# asp.net asp.net-mvc razor html5-audio


    【解决方案1】:

    您可以像这样更改 HTML 的 foreach 部分:

    @foreach (var item in Model)
    {
        <tr>
            <td>                
                <article class="audio">
                    <audio controls>
                        <source src="@item.SongFilePath" id="@item.Id" type="audio/mp3" />
                    </audio>
                </article>
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.HeaderId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.SongId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.DateAdded)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
                @Html.ActionLink("Details", "Details", new { id = item.Id }) |
                @Html.ActionLink("Delete", "Delete", new { id = item.Id })
            </td>
        </tr>
    }
    

    同样在控制器中,你不应该传递“文件”,你传递服务器上的“文件位置”(文件的URL)就足够了。

    请检查代码。如果有更多信息,请告诉我。

    更新:

    让我更清楚地解释一下。我把这个项目作为一个样本。让我们看看这个。 这是一个 HTML 部分:

    @model IEnumerable<WebApplication1.Models.Playlist_Contents_MVC>
    
    
    <h2>PlaylistContents</h2>
    
    <table class="table">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.SongFilePath)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.HeaderId)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.SongId)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.DateAdded)
            </th>
            <th></th>
        </tr>
    
        @foreach (var item in Model)
        {
            <tr>
                <td> 
                    <article class="audio">
                        <audio controls>
                            <source src="@item.SongFilePath" id="@item.Id" type="audio/mp3" />
                        </audio>
                    </article>
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.HeaderId)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.SongId)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.DateAdded)
                </td>
                <td>
                    @Html.ActionLink("Edit", "Edit", new { id = item.Id }) |
                    @Html.ActionLink("Details", "Details", new { id = item.Id }) |
                    @Html.ActionLink("Delete", "Delete", new { id = item.Id })
                </td>
            </tr>
        }
    
    </table>
    

    这些代码是我的控制器:

    public ActionResult Index()
        {
            List<Playlist_Contents_MVC> model = new List<Playlist_Contents_MVC>();
            model.Add(new Playlist_Contents_MVC() { DateAdded = DateTime.Now, HeaderId = 1, Id = 1, SongId = 1, SongFilePath = "/mp3FolderOnServer/1.mp3" });
            model.Add(new Playlist_Contents_MVC() { DateAdded = DateTime.Now, HeaderId = 2, Id = 2, SongId = 2, SongFilePath = "/mp3FolderOnServer/2.mp3" });
            model.Add(new Playlist_Contents_MVC() { DateAdded = DateTime.Now, HeaderId = 3, Id = 3, SongId = 3, SongFilePath = "/mp3FolderOnServer/3.mp3" });
            model.Add(new Playlist_Contents_MVC() { DateAdded = DateTime.Now, HeaderId = 4, Id = 4, SongId = 4, SongFilePath = "/mp3FolderOnServer/4.mp3" });
            model.Add(new Playlist_Contents_MVC() { DateAdded = DateTime.Now, HeaderId = 5, Id = 5, SongId = 5, SongFilePath = "/mp3FolderOnServer/5.mp3" });
            return View(model);
        }
    

    最后是结果:

    它对我有用。请注意,我用样本数据填充我的模型。您应该用数据库中的数据填充它。我认为您的文件路径不正确。查看我的文件路径,它来自服务器位置。

    【讨论】:

    • 抱歉,songFile.FILE 只是文件路径。当我制作数据库表时,我应该让它更清晰的列名。我尝试了您的更改,但似乎没有用。似乎 foreach 只是完全跳过了音频标签,并希望在加载时呈现一个媒体播放器。
    • 非常感谢您浏览一下 :) 非常感谢。
    • 我已经意识到 src 属性在引用服务器路径时不喜欢使用 ~ 键,因为我过去使用得很好,这就是导致我头疼的原因用你最初的建议靠墙一段时间,但在意识到这一点之后它就起作用了!非常感谢您,我非常感谢您。祝你好运:) @user1825943
    • 此外,它最初不起作用,因为我使用完整路径而不是虚拟(在路径中使用 ~ 键导致它仍然无法工作)调用文件作为参考。再次感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多