Unable to read View Bag value from controller to view

元气小坏坏 提交于 2019-12-13 07:23:45

问题


I have created a view bag in controller's post back event which stores the image path. Then,i used this view bag value in image src attribute.But image is not displayed.

Model:

public class FileManagement
     {
    public string FileName { get; set; }
    public string Path { get; set; }
      }

Code for uploading image

      [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();
    }

Controller

    [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();
    }

View:

    @using (Html.BeginForm())

   {
    <div>
    <img src="@Url.Content(ViewBag.Imagepath)" width="200" height="200" />
    </div>
    <input type="submit" value="Display" />
   }

回答1:


In my opinion, your problem is not to do with ASP.NET MVC, but you are missing some HTML/Web basics.

You have to understand that when you want to access a resource (html file, image etc), you have to use the HTTP URI syntax. You cannot and should not use your Windows file system path syntax.

Using something like C:\\Users\\Wasfa\\Documents\\Visual Studio 2012\\Projects\\MvcMembership\\MvcMembership\\App_Data\\Uploads\\annonymous.jpg" in HTML is completely wrong. To understand it better, imagine when you have your ASP.NET MVC website up and running for its users to access, they will come to you web page and the HTML downloaded on their browser will be:

<img src="C:\Users\Wasfa\Documents\Visual Studio 2012\Projects\MvcMembership\MvcMembership\App_Data\Uploads\annonymous.jpg" />

Do you think that path will exist on their computers? No.

So, to instruct the <img /> tag to fetch the image from the server, you have to specify either a full HTTP URI, for example:

<img src="http://mywebsite.com/Content/Uploads/annonymous.jpg" />

or a relative HTTP URI (which is like a relative path from your web site's root folder):

<img src="~/Content/Uploads/annonymous.jpg" />

Another problem with your approach is that App_Data is a special folder and its contents are not accessible from the browser by default. So, as per ASP.NET MVC convention, you can create a Content folder in your project to hold your static images and other static content like style sheels, and then link to them.

Once you do that, no one stops you from providing the relative path for your default image as a ViewBag property.

ViewBag.Imagepath = "~/Content/Uploads/annonymous.jpg";

And then use it the way you want:

<img src="@Url.Content(ViewBag.Imagepath)" width="200" height="200" />

I also expect the paths you subsequently fetch from the database, also follow this scheme.




回答2:


  • path for image must have forward slash (/),
  • more over this type of path might work only in your local system and not in your server.
  • Try using Server.MapPath to fetch your path
  • Using ViewBag for displaying image is a bad idea, consider using your model property to store the image path and use

    <img src="@Url.Content(Model.ImagePath)" alt = "Image" />

EDIT :

Controller:

    [HttpGet]
    public ActionResult DisplayPic()
    {
        FileManagement fm = new FileManagement();
        fm.Path = "Your image path";

        return View(fm);
    }

View :

`<img src="@Url.Content(Model.path)" alt = "Image" />`

didn't check the code, but this should work.




回答3:


It looks like you only really need one result for getPath, this might clean your code up a bit

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
}

Other than that your code looks fine, can you debug through your application and see what imgPath is equal to after your query is run?




回答4:


In case, if the image to be displayed when export to excel from the web page. Use the server path of the image, otherwise, the image would not be loaded from the assembly image folder.

Example:

config:

<add key="LogoPath" value="http:\\mysite\\images\\" />

code:

companyLogo = string.Format("{0}myLogo.png", System.Web.Configuration.WebConfigurationManager.AppSettings["LogoPath"]);

HTML:

<img src='" + @Url.Content(companyLogo) + "' />


来源:https://stackoverflow.com/questions/19067187/unable-to-read-view-bag-value-from-controller-to-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!