使用ViewBag动态显示图像

时间:2014-12-01 22:36:09

标签: c# asp.net asp.net-mvc-5

我想在同一视图中动态显示和更改图像。 所以我尝试使用代码: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");
}

3 个答案:

答案 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?)。