我在控制器的回发事件中创建了一个视图包,用于存储图像路径。 然后,我在图像src属性中使用了这个视图包值。但是没有显示图像。
型号:
public class FileManagement
{
public string FileName { get; set; }
public string Path { get; set; }
}
上传图片的代码
[HttpPost]
public ActionResult UploadPic(FileManagement fmanage, HttpPostedFileBase file)
{
string email = User.Identity.Name;
if (file != null && file.ContentLength > 0)
{
var FileName = string.Format("{0}.{1}", Guid.NewGuid(), Path.GetFileName(file.FileName));
var path = Path.Combine(Server.MapPath("~/Content/Uploads"), FileName);
file.SaveAs(path);
using (var session = DocumentStore.OpenSession("RavenMemberShip"))
{
var query = from q in Session.Query<Registration>() where q.Email == email select q;
if (query.Count() > 0)
{
foreach (var updated in query)
{
updated.FileName = FileName;
updated.Path = path;
session.SaveChanges();
}
}
}
}
else ModelState.AddModelError("", "Remove the errors and try again");
return View();
}
控制器
[HttpGet]
public ActionResult DisplayPic()
{
ViewBag.Imagepath = "C:\\Users\\Wasfa\\Documents\\Visual Studio 2012\\Projects\\MvcMembership\\MvcMembership\\App_Data\\Uploads\\annonymous.jpg";
return View();
}
[HttpPost]
public ActionResult DisplayPic(FileManagement fm)
{
using (var session = DocumentStore.OpenSession("RavenMemberShip"))
{
string ipath;
// string UserName = User.Identity.Name;
string UserName = "wasfa_anjum@yahoo.com";
var getPath = from p in Session.Query<Registration>()
where p.Email == UserName
select p;
if (getPath.Count() > 0)
{
foreach (var imgpath in getPath)
{
ipath = imgpath.Path;
ViewBag.Imagepath = ipath;
}
}
}
return View();
}
查看:
@using (Html.BeginForm())
{
<div>
<img src="@Url.Content(ViewBag.Imagepath)" width="200" height="200" />
</div>
<input type="submit" value="Display" />
}
答案 0 :(得分:2)
在我看来,您的问题与ASP.NET MVC无关,但您缺少一些HTML / Web基础知识。
您必须了解当您要访问资源(html文件,图像等)时,必须使用HTTP URI语法。您不能也不应该使用Windows文件系统路径语法。
在HTML中使用类似C:\\Users\\Wasfa\\Documents\\Visual Studio 2012\\Projects\\MvcMembership\\MvcMembership\\App_Data\\Uploads\\annonymous.jpg"
的内容是完全错误的。为了更好地理解它,想象一下当你的ASP.NET MVC网站启动并运行以供其用户访问时,它们将来到你的网页,并且在他们的浏览器上下载的HTML将是:
<img src="C:\Users\Wasfa\Documents\Visual Studio 2012\Projects\MvcMembership\MvcMembership\App_Data\Uploads\annonymous.jpg" />
你认为他们的计算机上会存在这条路吗?没有。
因此,要指示<img />
标记从服务器获取图像,您必须指定完整的HTTP URI,例如:
<img src="http://mywebsite.com/Content/Uploads/annonymous.jpg" />
或相对HTTP URI(类似于网站根文件夹的相对路径):
<img src="~/Content/Uploads/annonymous.jpg" />
您的方法的另一个问题是App_Data
是一个特殊文件夹,默认情况下无法从浏览器访问其内容。因此,根据ASP.NET MVC约定,您可以在项目中创建一个Content
文件夹来保存静态图像和其他静态内容,如样式剪辑,然后链接到它们。
一旦你这样做,没有人阻止你提供默认图像的相对路径作为ViewBag属性。
ViewBag.Imagepath = "~/Content/Uploads/annonymous.jpg";
然后按照您想要的方式使用它:
<img src="@Url.Content(ViewBag.Imagepath)" width="200" height="200" />
我还希望您随后从数据库中获取的路径也遵循此方案。
答案 1 :(得分:1)
Server.MapPath
获取路径使用ViewBag显示图片是一个坏主意,请考虑使用您的模型属性存储图像路径并使用
<img src="@Url.Content(Model.ImagePath)" alt = "Image" />
编辑:
控制器:
[HttpGet]
public ActionResult DisplayPic()
{
FileManagement fm = new FileManagement();
fm.Path = "Your image path";
return View(fm);
}
查看:
`<img src="@Url.Content(Model.path)" alt = "Image" />`
没有检查代码,但这应该可行。
答案 2 :(得分:0)
看起来你只需要一个getPath结果,这可能会稍微清理你的代码
var imgPath= Session.Query<Registration>()
.FirstOrDefault(p => p.Email == UserName)
.Select(i => i.Path);
if (!string.IsNullOrEmpty(imgPath)
ViewBag.Imagepath = imgPath;
else
{
//no user found, handle error
}
除了您的代码看起来很好之外,您可以通过应用程序进行调试,并在查询运行后查看imgPath等于什么?
答案 3 :(得分:0)
如果是从网页导出到excel时要显示的图像。 使用图像的服务器路径,否则,将不会从程序集图像文件夹中加载图像。
示例强>:
配置:
<add key="LogoPath" value="http:\\mysite\\images\\" />
代码:
companyLogo = string.Format("{0}myLogo.png", System.Web.Configuration.WebConfigurationManager.AppSettings["LogoPath"]);
HTML:
<img src='" + @Url.Content(companyLogo) + "' />