2014-12-01 7 views
0

Я хочу динамически отображать и изменять изображение в одном и том же представлении. Так что я пытался использовать код: Use MVC 3 ViewBag to dynamically change an imageДинамически отображать изображение с помощью ViewBag

и это: 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

Возможный дубликат [Использовать MVC 3 ViewBag для динамического изменения изображения] (http://stackoverflow.com/questions/14213182/use-mvc-3-viewbag-to-dynamically-change-an-image) попробуйте google search if all else fail – MethodMan

+0

Посмотрите на визуализированный HTML и убедитесь, что он правильный. Например: '' Также проверьте изображение в местоположении src. – luke2012

ответ

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"/> 

second Проблема заключается в том, что вы устанавливаете свойство 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?).

+0

Вы правы! Должен быть «return View» («Индекс»); »!! Спасибо :) –

0

Это потому, что Server.MapPath возвращает физический путь к образу, который не то, что вы хотите. Вам понадобится относительный путь к серверу (/ images/profile/xxxxx).

+0

Вы имеете в виду это? >> В контроллере: ViewBag.Foto = "~/images/profile /" + ImageID + ". Jpg"; –

+0

выньте ~, но да. –

+0

не работал ... не отображается. –

0

Я использовал бы «ViewBag.Foto» вместо «@ ViewBag.Foto».

Знак @ будет использоваться синтаксисом бритвы в представлении, но не в контроллере.

+0

Извините, это была моя ошибка ... но исходный код - «ViewBag.Foto = path.ToString();» –

Смежные вопросы