无法从控制器读取View Bag值以查看

时间:2013-09-28 12:53:22

标签: image asp.net-mvc-4 ravendb

我在控制器的回发事件中创建了一个视图包,用于存储图像路径。 然后,我在图像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" />
   }

4 个答案:

答案 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) + "' />