我想在同一视图中动态显示和更改图像。 所以我尝试使用代码:Use MVC 3 ViewBag to dynamically change an image
并且:Pass image from controller and display in a view using ViewBag in ASP.NET MVC 3
但没有用。
这是我的Index.cshtml
:
@using (Html.BeginForm("showFile", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.TextBox("ImageID")
<input type="submit" value="ok" class="submit" />
}
<img src="@ViewBag.Foto" alt="IMAGES" />
我的HomeController.cs
:
public ActionResult Index()
{
return View();
}
public ActionResult showFile(string ImageID)
{
var dir = Server.MapPath("/images/profile");
var path = Path.Combine(dir, ImageID + ".jpg");
if (System.IO.File.Exists(path))
{
ViewBag.Foto = path.ToString();
}
return RedirectToAction("Index", "Home");
}
答案 0 :(得分:0)
那是因为Server.MapPath将返回图像的物理路径,这不是你想要的。您将需要服务器相对路径(/ images / profile / xxxxx)。
答案 1 :(得分:0)
我会使用&#34; ViewBag.Foto&#34;而不是&#34; @ ViewBag.Foto&#34;。
@符号将在视图中由razor语法使用,但不在控制器中使用。
答案 2 :(得分:0)
我相信您提供的代码示例存在两个问题。
第一个问题是您提供了图片代码的完整路径。您正在设置ViewBag.Foto属性,其中Server.MapPath()
的内容与图片相结合,因此生成的img
标记看起来类似于:
<img src="C:\your-local-path-here\images\profiles\image.jpg" alt="IMAGES"/>
但你真正想要的是类似的东西:
<img src="/images/profile/image.jpg" alt="IMAGES"/>
第二个问题是您使用图片路径设置ViewBag
属性,然后执行重定向。当您向浏览器返回重定向时,不会为ViewBag
操作的下一个请求维护Index()
的内容。
因此控制器代码可以更改为:
public ViewResult Index()
{
return View();
}
[HttpPost]
public ViewResult ShowFile(string imageId)
{
var virtualPath = string.Format("~/images/profile/{0}.jpg", imageId);
if (System.IO.File.Exists(Server.MapPath(virtualPath)))
{
ViewBag.Foto = VirtualPathUtility.ToAbsolute(virtualPath);
}
return View("Index");
}
此外,您无需在表单中指定new { enctype = "multipart/form-data" }
(请参阅What does enctype='multipart/form-data' mean?)。