2017-02-14 6 views
-1

Ich möchte Bilder für Galerie und Hauptseite in meiner Website hochladen, so ich Bild in Dateisystem hochladen und Info abvout Bilder in db speichern, verwende ich eine zu viele Beziehung in der Datenbank und ich benutze View Model. Alle Daten Updates in der Datenbank ohne Problem, ich habe es überprüft, aber ich kann nicht Bilder in der Ansicht anzeigen, vielleicht muss ich etwas anderes in meiner Methode Edit ?? Bitte erkläre mich. So, hier ist mein Code: Ansicht ModelleKann das Bild nicht aus der Datenbank anzeigen View Model

public class FurnitureVM 
{ 
    public FurnitureVM() 
    { 
     this.MainImage = new ImageVM(); 
     this.SecondaryImages = new List<ImageVM>(); 
    } 

    public int? ID { get; set; } 
    [Display(Name = "Name")] 
    [Required(ErrorMessage = "Enter name")] 
    public string Name { get; set; } 

    [DataType(DataType.MultilineText)] 
    [Display(Name = "...")] 
    [Required(ErrorMessage = "...")] 
    public string Description { get; set; } 
    [Display(Name = "Price()")] 
    [Required] 
    [Range(0.01, double.MaxValue, ErrorMessage = "...")] 
    public decimal Price { get; set; } 

    [Display(Name = "...")] 
    [Required(ErrorMessage = "...")] 
    public string Manufacturer { get; set; } 
    [Display(Name = "Size")] 
    [Required(ErrorMessage = "...")] 
    public string Size { get; set; } 

    [Display(Name = "....")] 
    [Required] 
    public int CategoryId { get; set; } 
    public virtual Category Category { get; set; } 

    public IEnumerable<SelectListItem> CategoryList { get; set; } 
    public HttpPostedFileBase MainFile { get; set; } 
    public IEnumerable<HttpPostedFileBase> SecondaryFiles { get; set; } 
    public ImageVM MainImage { get; set; } 
    public List<ImageVM> SecondaryImages { get; set; } 
} 
public class ImageVM 
{ 
    public int? ID { get; set; } 
    public string Path { get; set; } 
    public string DisplayName { get; set; }   
} 

Meine Methode in der Steuerung:

public ActionResult Edit(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    var furniture = db.Furnitures.Find(id); 
    if (furniture == null) 
    { 
     return HttpNotFound(); 
    } 

    FurnitureImages main = furniture.Images.Where(x => x.IsMainImage).FirstOrDefault(); 

     FurnitureVM model = new FurnitureVM(); 
     model.Name = furniture.Name; 
     model.Description = furniture.Description; 
     model.Price = furniture.Price; 
     model.Size = furniture.Size; 
     model.CategoryId = furniture.CategoryId; 
     model.Manufacturer = furniture.Manufacturer; 
     model.MainImage.Id = main.Id; 
     model.MainImage.DisplayName = main.DisplayName; 
     model.MainImage.Path = main.Path; 
     model.MainImage.IsMainImage = main.IsMainImage; 

    //ViewBag.CategoryId = new SelectList(db.Categories, "CategoryId", "Name", furniture.CategoryId); 
    return View(model); 
} 

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Edit(FurnitureVM model) 
{ 
    if (model.MainFile != null && model.MainFile.ContentLength > 0) 
    { 
     string displayName = model.MainFile.FileName; 
     string extension = Path.GetExtension(displayName); 
     string fileName = string.Format("{0}.{1}", Guid.NewGuid(), extension); 
     string path = Path.Combine(Server.MapPath("~/Upload/"), fileName); 
     model.MainFile.SaveAs(path); 
     model.MainImage = new ImageVM() { Path = path, DisplayName = displayName }; 
    } 

    foreach (HttpPostedFileBase file in model.SecondaryFiles) 
    { 
     FurnitureImages images = new FurnitureImages 
     { 
      //This is for secondary images for gallery 
     }; 
    } 

    if (!ModelState.IsValid) 
    { 
     model.CategoryList = new SelectList(db.Categories, "CategoryId", "Name",model.CategoryId); // repopulate the SelectList 
     return View(model); 
    } 

    Furniture furniture = db.Furnitures.Where(x => x.FurnitureId == model.ID).FirstOrDefault(); 
     FurnitureImages main = furniture.Images.Where(x => x.IsMainImage).FirstOrDefault(); 
     furniture.Name = model.Name; 
     furniture.Description = model.Description; 
     furniture.Manufacturer = model.Manufacturer; 
     furniture.Price = model.Price; 
     furniture.CategoryId = model.CategoryId; 
     furniture.Size = model.Size; 
     main.Id = model.ID; 
     main.DisplayName = model.MainImage.DisplayName; 
     main.Path = model.MainImage.Path; 
     main.IsMainImage = model.MainImage.IsMainImage; 


    if (model.MainImage != null && !model.MainImage.ID.HasValue) 
    { 
     FurnitureImages image = new FurnitureImages 
     { 
      Path = model.MainImage.Path, 
      DisplayName = model.MainImage.DisplayName, 
      IsMainImage = true 
     }; 
     furniture.Images.Add(image); 
    } 

    // ViewBag.CategoryId = new SelectList(db.Categories, "CategoryId", "Name", furniture.CategoryId); 
    db.Entry(furniture).State = EntityState.Modified; 
    db.SaveChanges(); 
    return RedirectToAction("Index"); 
} 

und ein Teil meiner Ansicht

@model FurnitureStore.ModelView.FurnitureVM 
... 
@if (Model.MainImage != null) 
{ 
    @Html.HiddenFor(m => m.MainImage.ID) 
    @Html.HiddenFor(m => m.MainImage.Path) 
    @Html.HiddenFor(m => m.MainImage.DisplayName) 
    <img src="@Model.MainImage.Path" alt="@Model.MainImage.DisplayName" /> 
} 

@Html.TextBoxFor(m => m.SecondaryFiles, new { type = "file", multiple = "multiple" }) 
@Html.ValidationMessageFor(m => m.SecondaryFiles) 

@for (int i = 0; i < Model.SecondaryImages.Count; i++) 
{ 
    @Html.HiddenFor(m => m.SecondaryImages[i].ID) 
    @Html.HiddenFor(m => m.SecondaryImages[i].Path) 
    @Html.HiddenFor(m => m.SecondaryImages[i].DisplayName) 
    <img src="@Model.SecondaryImages[i].Path" alt="@Model.MainImage.DisplayName" /> 
} 
+0

können Sie zeigen, wie der Pfad wie in der Datenbank sucht, die gespeichert wird, ist es relativ Weg? –

+0

@Ehsan Sajjad D: \ Visualstudio2015 \ MöbelStore \ FurnitureStore \ Upload \ 4b44e4ce-59fc-4ba5-8f1d-719e1e8b1006..jpg wie mein Pfad aussieht –

+0

Beachten Sie die 'Path.GetExtension (displayName);' gibt '.jpg' zurück (enthält den Punkt) so sollte es nur sein 'string fileName = string.Format (" {0} {1} ", Guid.NewGuid(), Erweiterung);' –

Antwort

0

Sie sollten nicht absoluten Pfad werden die Speicherung in die Datenbank, sondern speichern Sie den relativen Pfad, für den Sie die folgende Codezeile aktualisieren müssten:

string path = "~/Upload/"+ fileName; 
model.MainFile.SaveAs(Server.MapPath(path)); 

jetzt Ihrer Meinung nach würden Sie in der Lage sein, es auf diese Weise angezeigt werden:

<img src="@Url.Content(Model.MainImage.Path)" alt="@Model.MainImage.DisplayName" /> 

Wenn Sie den Pfad nicht ändern können Logik zu sparen und den absoluten Pfad aus irgendeinem Grund speichern möchten, dann können Sie sich am folgenden Beitrag:

https://stackoverflow.com/a/12804451/1875256

+0

Hallo, danke ich akzeptiere es als asnwer, aber kannst du mir bitte helfen, jetzt kann ich Secondary Images nicht mehr anzeigen, so gehe ich zum Modell und meiner Ansicht über http://pastebin.com/DpBsRB0a –

0

Controller-Seite gut aussieht Sie benötigen Code anzeigen

ändern

und dann wird der Rest der Dinge funktionieren wie

<img src="@Url.Content(Model.MainImage.Path)" alt="@Model.MainImage.DisplayName" /> 

ODER

<img src="@Url.Content(Model.SecondaryImages[i].Path)" alt="@Model.MainImage.DisplayName" /> 
+0

Okay, ich habe deinen Code ausprobiert, jetzt habe ich eine Ausnahme, der Wert darf nicht null sein, name: contentPath. Dieser Fehler in 1 Zeile oberhalb von Ihrem Code, hier @ Html.HiddenFor (m => m.MainImage.DisplayName) –

Verwandte Themen