我想在视图页面上显示控制器操作的图像
本文关键字:控制器 显示 操作 图像 视图 | 更新日期: 2023-09-27 17:59:53
public ActionResult GetContentFromFTP()
{
string[] FTP_Imagery = Directory.GetFiles(@"F:'abc'imgfiles'Imagery'");
string[] FTP_Audio = Directory.GetFiles(@"F:'abc'audiofiles'Audio'");
return View("showfiles");
}
这是我的控制器操作,其中两个字符串数组包含所有音频文件和图像文件的路径。现在,我必须在我的视图页面"showfiles"上显示这些图像。请告诉我如何实现这一点?
有很多方法可以将数据从控制器获取到视图,您可以使用ViewBag
控制器:
public ActionResult GetContentFromFTP()
{
string[] FTP_Imagery = Directory.GetFiles(@"F:'abc'imgfiles'Imagery'");
string[] FTP_Audio = Directory.GetFiles(@"F:'abc'audiofiles'Audio'");
ViewBag.Add("FTP_Imagery", FTP_Imagery);
ViewBag.Add("FTP_Audio", FTP_Audio);
return View("showfiles");
}
视图:
@foreach(var img in ViewBag["FTP_Imagery"]){
<!-- HTML for each image file -->
}
@foreach(var audio in ViewBag["FTP_Audio"]){
<!-- HTML for each audio file -->
}
在我看来,您应该利用MVC的强类型视图,并拥有一个ViewModel类(例如ShowFilesViewModel
(,该类具有视图所需的任何属性,例如每个数组然后在视图模型类中强烈键入您的视图:
视图模型:
public class ShowFilesViewModel()
{
public string[] Images {get; set;}
public string[] Audio {get; set;}
// anything else you need for your view...
}
控制器:
public ActionResult GetContentFromFTP()
{
string[] FTP_Imagery = Directory.GetFiles(@"F:'abc'imgfiles'Imagery'");
string[] FTP_Audio = Directory.GetFiles(@"F:'abc'audiofiles'Audio'");
var viewModel = new ShowFilesViewModel()
{
Images = FTP_Imagery;
Audio = FTP_Audio;
};
return View("showfiles", viewModel);
}
视图:
@model ShowFilesViewModel
@foreach(var image in Model.Images){
<!-- HTML for an image file -->
}
@foreach(var image in Model.Audio){
<!-- HTML for an audio file -->
}
Controller.View方法有一个重载,它还可以向视图传递一个模型,在本例中是您的字符串数组。将您的代码更改为:
public ActionResult GetContentFromFTP()
{
string[] FTP_Imagery = Directory.GetFiles(@"F:'abc'imgfiles'Imagery'");
string[] FTP_Audio = Directory.GetFiles(@"F:'abc'audiofiles'Audio'");
return View("showfiles", FTP_Imagery);
}
在视图中,使用模型对象获取图像并使用标准HTML显示它们。一个解决方案可能是这样的:
@foreach (var image in Model)
{
<img src="@image" />
<br />
}
关于模型以及控制器和视图之间的通信的好教程可以在ASP.NET网站上找到——MVC简介和从控制器访问模型。
您只需创建一个包含媒体和图像数组的视图模型类,如下所示:
class ViewModel{
Public string[] Images {get;set;}
Public string[] Videos {get;set;}
}
所以在你的行动中:
public ActionResult GetContentFromFTP()
{
string[] FTP_Imagery = Directory.GetFiles(@"F:'abc'imgfiles'Imagery'");
string[] FTP_Audio = Directory.GetFiles(@"F:'abc'audiofiles'Audio'");
ViewModel vm = new ViewModel(){Images = FTP_Imagery,Videos=FTP_Audio };
return View("showfiles", vm);
}
视图:
@foreach (var image in Model.Images)
{
<img src="@image" />
<br />
}
@foreach (var video in Model.Videos)
{
<video src="@video " />
<br />
}
在MVC中为播放视频而制作,并通过自定义动作过滤器从控制器获取此视频,这可能对您非常有用。
1(为自定义操作过滤器添加新的类文件"VideoDataResult.cs">
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Hosting;
using System.Web.Mvc;
namespace PlayVideoInMVC.CustomDataResult
{
public class VideoDataResult : ActionResult
{
/// <summary>
/// The below method will respond with the Video file
/// </summary>
/// <param name="context"></param>
public override void ExecuteResult(ControllerContext context)
{
var strVideoFilePath = HostingEnvironment.MapPath("~/VideoFiles/Test2.mp4");
context.HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=Test2.mp4");
var objFile = new FileInfo(strVideoFilePath);
var stream = objFile.OpenRead();
var objBytes = new byte[stream.Length];
stream.Read(objBytes, 0, (int)objFile.Length);
context.HttpContext.Response.BinaryWrite(objBytes);
}
}
}
2添加"VideoDataController"控制器文件使用系统;使用System.Collections.Generic;使用System.Linq;使用System.Web;使用PlayVideoInMVC.CustomDataResult;使用System.Web.Mvc;
namespace PlayVideoInMVC.Controllers
{
public class VideoDataController : Controller
{
//
// GET: /VideoData/
public ActionResult Index()
{
return new VideoDataResult();
}
}
}
3(添加"视图"的HTML标记:@{ViewBag.Title="索引";}
<h2>Play Video</h2>
<h3><a href="@Url.Action("Index", "VideoData")">Download Video</a> </h3>
<video width="320" height="240" controls autoplay="autoplay">
<source src="@Url.Action("Index", "VideoData")" type="video/mp4">
</video>