我正在使用一个小型应用程序只是为了学习 .NET Core 和 C#。我有一个名为 Movie 的模型,其字段之一是用于存储图像的字节数组。我想知道如何使用 JsonPatchDocument 来更新该字段。
电影模型:
public class Movie
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int id_movie { get; set; }
[Required]
public string name_movie { get; set; }
public byte[]? img_movie { get; set; }
public string? desc_movie { get; set; }
public int duration_movie { get; set; }
public type_class_movie class_movie { get; set; }
public DateTime? created_at_movie { get; set; }
public DateTime? updated_at_movie { get; set; }
public int id_category_movie { get; set; }
[ForeignKey("id_category_movie")]
public Category? Category { get; set; }
}
public enum type_class_movie { Siete, Trece, Diesciseis, Dieciocho }
电影控制器:
[HttpPatch("update_movie/{id_movie:int}", Name = "UpdateMovie")]
public IActionResult UpdateMovie(int id_movie, [FromForm] Movie movie, IFormFile imagen)
{
try
{
if (!_mRepo.MovieExistsById(id_movie))
{
var errorResponse = new
{
StatusCode = 400,
Message = "Movie doesn't exists"
};
return StatusCode(400, errorResponse);
}
using (var memoryStream = new MemoryStream())
{
await imagen.CopyToAsync(memoryStream);
movie.img_movie = memoryStream.ToArray();
}
if (!_mRepo.UpdateMovie(entity))
{
var errorResponse = new
{
StatusCode = 500,
Message = "An error ocurred while processing the request"
};
return StatusCode(500, errorResponse);
}
return StatusCode(200, new { updt_cat = entity });
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
var errorResponse = new
{
StatusCode = "Error",
Message = "An error occurred while processing the request."
};
return StatusCode(500, errorResponse);
}
}
我喜欢 JsonPatchDocument 部分更新的工作方式,但我不知道如何使用它来获取可能包含图像的表单的部分更新,感谢任何帮助。
当然有可能。你遵循这个教程吗? https://trycatchdebug.net/news/1211513/jsonpatchdocument-and-iformfile-in-c 根据这个文档,我认为你需要做以下修改:
[HttpPatch("update_movie/{id_movie:int}", Name = "UpdateMovie")]
//change mehtod to async
public async Task<IActionResult> UpdateMovie(int id_movie, [FromForm] JsonPatchDocument<Movie> patchDocument, IFormFile imagen)
{
try
{
var movie = await _mRepoawait.MovieFindById(id_movie); // "MovieFindById implement from _dbcontext.Movies.FindAsync(id);
if (movie == null)
{
var errorResponse = new
{
StatusCode = 400,
Message = "Movie doesn't exists"
};
return StatusCode(400, errorResponse);
}
patchDocument.ApplyTo(movie); //use "ApplyTo" to update the "movie" model
using (var memoryStream = new MemoryStream())
{
await imagen.CopyToAsync(memoryStream);
movie.img_movie = memoryStream.ToArray();
}
if (!_mRepo.UpdateMovie(movie)) //"UpdateMovie" should have implement _dbcontext.SaveChangesAsync();
{
var errorResponse = new
{
StatusCode = 500,
Message = "An error ocurred while processing the request"
};
return StatusCode(500, errorResponse);
}
return StatusCode(200, new { updt_cat = movie });
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
var errorResponse = new
{
StatusCode = "Error",
Message = "An error occurred while processing the request."
};
return StatusCode(500, errorResponse);
}
}
您需要安装的软件包:
Microsoft.AspNetCore.JsonPatch
Microsoft.AspNetCore.Mvc.NewtonsoftJson
如果您的控制器具有
[ApiController]
属性,则 multipart/formdata 将不起作用。您需要更改program.cs,如下所示:
builder.Services.AddControllers().AddNewtonsoftJson().ConfigureApiBehaviorOptions(o => {
o.SuppressInferBindingSourcesForParameters = true;
});
然后您可以使用邮递员来测试您的端点,如下所示:(更改电影名称和图像)
参考:https://learn.microsoft.com/en-us/aspnet/core/web-api/jsonpatch?view=aspnetcore-8.0