Как загрузить изображение с помощью формы в ASP.NET MVC - PullRequest
0 голосов
/ 23 сентября 2018

Я знаю, что есть много учебных пособий, но я не могу их понять, поскольку они просто публикуют свои коды с плохим объяснением, плюс HttpPostedFileBase ломает мой проект, как только я добавляю это в свой проект класса модели, проект перестает работать со следующей ошибкой:

Значение не может быть нулевым.

Имя параметра: entitySet

.Я хочу добавить внешний ключ к моей модели фильмов для изображений, создать новые изображения моделей и добавить к ним изображения.

Модель фильма:

public class Movie
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }
    public Genre Genre { get; set; }
    [Display(Name = "Genre")]
    public int GenreId { get; set; }
    [Required]
    public DateTime DateAdded { get; set; }
    [Required]
    [Display(Name = "Release Date")]
    public DateTime DateReleased { get; set; }
    [Required]
    [Display(Name = "Number in Stock")]
    [Range(1, 20)]
    public int Stock { get; set; }
    public int? ImageId { get; set; }
    public Image ImageModel { get; set; }
}

Модель изображения:

public class Image
{
    public int Id { get; set; }
    [Required]
    public string UrlOfImage { get; set; }
}

Контроллер сохранения фильма:

public ActionResult Save(Movie movie)
{
    if (ModelState.IsValid)
    {
        if (movie.Id == 0)
        {
            movie.DateAdded = DateTime.Now;
            _context.Movies.Add(movie);
        }
        else
        {
            var movieInDb = _context.Movies.Single(m => m.Id == movie.Id);
            movieInDb.Name = movie.Name;
            movieInDb.GenreId = movie.GenreId;
            movieInDb.Stock = movie.Stock;
            movieInDb.DateReleased = movie.DateReleased;
        }

        _context.SaveChanges();

        return RedirectToAction("Index", "Movies");
    }

    var viewModel = new NewMovieViewModel(movie)
    {
        Genres = _context.Genres.ToList()
    };
    ModelState.Clear();
    return View("MovieForm", viewModel);
}

NewMovieViewModel

public class NewMovieViewModel
{
    public IEnumerable<Genre> Genres { get; set; }

    public int? Id { get; set; }

    [Required]
    [StringLength(255)]
    public string Name { get; set; }

    [Display(Name = "Genre")]
    [Required]
    public int? GenreId { get; set; }

    [Display(Name = "Release Date")]
    [Required]
    public DateTime? DateReleased { get; set; }

    [Display(Name = "Number in Stock")]
    [Range(1, 20)]
    [Required]
    public int? Stock { get; set; }

    public int? ImageId { get; set; }
    public Image Image { get; set; }
    public string Title
    {
        get
        {
            return Id != 0 ? "Edit Movie" : "New Movie";
        }
    }

    public NewMovieViewModel()
    {
        Id = 0;
    }

    public NewMovieViewModel(Movie movie)
    {
        Id = movie.Id;
        Name = movie.Name;
        DateReleased = movie.DateReleased;
        Stock = movie.Stock;
        GenreId = movie.GenreId;
        ImageId = movie.ImageId;
    }
}

Ответы [ 3 ]

0 голосов
/ 23 сентября 2018

Вы должны определить параметр HttpPostedFileBase в вашем методе

public Action Save(Movie movie, HttpPostedFileBase image)

И, на ваш взгляд, у вас должен быть вход с именем "image"

<input type="file" name="image"  />
0 голосов
/ 24 сентября 2018

Вы можете попробовать это.

Ваш взгляд должен выглядеть следующим образом:

@using(Html.BeginForm("UploadFile","Upload", FormMethod.Post, new { 
 enctype="multipart/form-data"}))  
{ 
<div>  
    @Html.TextBox("file", "", new {  type= "file"}) <br />  

    <input type="submit" value="Upload" />  

    @ViewBag.Message  

</div>      
}

Ваш контроллер должен выглядеть так:

[HttpPost]  
publicActionResultUploadFile(HttpPostedFileBase file)  
{  
    try  
    {  
        if (file.ContentLength > 0)  
        {  
            string _FileName = Path.GetFileName(file.FileName);  
            string _path = Path.Combine(Server.MapPath("~/UploadedFiles"), _FileName);  
            file.SaveAs(_path);  
        }  
        ViewBag.Message = "File Uploaded Successfully!!";  
        return View();  
    }  
    catch  
    {  
        ViewBag.Message = "File upload failed!!";  
        return View();  
    }  
}  
0 голосов
/ 23 сентября 2018

Идея состояла бы в том, чтобы сохранить данные больших двоичных объектов отдельно в некотором хранилище больших двоичных объектов, и вызов должен быть асинхронным.Это будет совершенно отдельный вызов и, возможно, для определенного контейнера BLOB-объектов.

Независимо от того, является ли ваша страница административной или пользовательской, это не имеет значения.чтобы обеспечить удобство работы с пользователем, вы либо захотите загрузить изображение, как только пользователь выберет изображение в контейнере и вернет URL-адрес, который вы сохраните в таблице метаданных.

Или вы можете разрешитьсначала сохраните все данные, а затем попросите пользователя обновить / добавить изображение в записи.

Вам также необходимо продумать, как вы будете сохранять данные (обычные данные и данные больших двоичных объектов) в большом количестве.и что было бы лучшим подходом для выполнения этих же операций в случае мобильных устройств?Кстати, в наше время мы всегда должны думать с точки зрения мобильного клиента.

Надеюсь, это будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...