C# 如何在ASP.NET MVC中使用表单上传图像

C# 如何在ASP.NET MVC中使用表单上传图像,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我知道有很多教程,但我无法理解它们,因为它们只是发布了解释不好的代码,加上HttpPostedFileBase正在破坏我的项目,一旦我将其添加到我的模型类项目中,就会停止使用以下erorr: 值不能为null 参数名称:entitySet 。我想为我的电影模型添加一个外键用于图像,并创建一个新的模型图像,并通过它添加图像 电影模型: public class Movie { public int Id { get; set; } [Required] public st

我知道有很多教程,但我无法理解它们,因为它们只是发布了解释不好的代码,加上HttpPostedFileBase正在破坏我的项目,一旦我将其添加到我的模型类项目中,就会停止使用以下erorr:

值不能为null

参数名称: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);
}
NewMoviewModel

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;
    }
}
公共类NewMovieViewModel
{
公共IEnumerable类型{get;set;}
公共int?Id{get;set;}
[必需]
[StringLength(255)]
公共字符串名称{get;set;}
[显示(Name=“流派”)]
[必需]
公共int?GenreId{get;set;}
[显示(Name=“发布日期”)]
[必需]
public DateTime?DateReleased{get;set;}
[显示(Name=“库存数量”)]
[射程(1,20)]
[必需]
public int?Stock{get;set;}
public int?ImageId{get;set;}
公共映像映像{get;set;}
公共字符串标题
{
得到
{
返回Id!=0?“编辑电影”:“新电影”;
}
}
公共NewMoviewModel()
{
Id=0;
}
公共NewMovieViewModel(电影)
{
Id=movie.Id;
Name=movie.Name;
DateReleased=movie.DateReleased;
股票=电影。股票;
GenreId=movie.GenreId;
ImageId=movie.ImageId;
}
}

我们的想法是将blob数据单独保存在一些blob存储中,调用应该是异步的。这将是一个完全独立的调用,可能针对特定的blob容器

不管你的页面是面向管理员还是面向用户,这都无关紧要。为了提供良好的用户体验,您可能希望在用户选择容器中的图像后立即上载图像,并返回URL,您将保存在元数据表中

或者,您可以允许首先保存所有数据,然后指导用户在记录中更新/添加图像

您还需要考虑如何批量保存数据(普通数据和blob数据)。在移动设备的情况下,做这些相同操作的更好方法是什么?顺便说一下,现在我们应该首先从移动客户端的角度来考虑


希望这会有所帮助。

您应该在方法中定义参数HttpPostedFileBase

public Action Save(Movie movie, HttpPostedFileBase image)
在您看来,您应该有一个名为“image”的输入


您可以尝试一下

您的视图应该如下所示:

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

您尝试了什么,但什么不起作用?@officer我什么都做不了他们都在模型类中使用HttpPostedFileBase,但对我来说,它不起作用,因为我将它添加到我的类中,我的项目停止工作,并且给出的错误值不能为null。参数名称:entitySetI编辑了我的帖子。我尝试使用HttpPostedFileBase,但它给出的错误值不能为null。参数名称:EntitySet您认为捕获异常并丢弃有价值的异常信息真的是一种很好的教学实践吗?当然不是。我只是试着给出一个上传文件的解决方案。异常可以记录在文本文件或任何你想要的文件中。
[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();  
    }  
}