我被困在实体框架的定义和使用对象。
一旦我在数据库中保存与该文件相关的详细信息,我正在尝试保存上传的文件。
public async Task<IActionResult> Edit(string List<IFormFile> files, [Bind("param")] Entity entity)
{
if (ModelState.IsValid)
{
try
{
_context.Update(entity);
await _context.SaveChangesAsync();
//update Attachments
if (files.Count > 0)
{
attachment.UploadFiles(files);
}
}
catch (DbUpdateConcurrencyException)
{
if (!EntityExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction("Index");
}
return View(entity);
}
当我运行应用程序并想要提交下面收到的表单时出现错误:
无法访问已处置的对象。
对象名称:'FileBufferingReadStream'。
[HttpPost]
public async void UploadFiles(List<IFormFile> files)
{
if (files == null || files.Count == 0)
{
log.error("files not selected");
}
try
{
List<string> filenames = new List<string>();
string directory = Directory.GetCurrentDirectory() + "\\wwwroot";
createDir(directory);
foreach (var file in files)
{
string filename = file.GetFilename();
filenames.Add(filename);
}
if (filenames.Count > 0)
foreach (var filename in filenames)
{
AttachmentQ(filename, directory, createdBy);
}
foreach (var file in files)
{
string filename = file.GetFilename();
var path = Path.Combine(directory, filename);
using (var stream = new FileStream(path, FileMode.Create))
{
await file.CopyToAsync(stream);
}
filenames.Add(filename);
}
}
catch (Exception e)
{
log.error(e.Message);
}
}
[ValidateAntiForgeryToken]
public async void AttachmentQ(string filename, string path, string createdBy)
{
try
{
Attachment attachment = new Attachment
{
Name = filename,
Path = path,
CreatedBy = createdBy,
CreatedDate = DateTime.Now
};
_context.Add(attachment);
await _context.SaveChangesAsync();
}
catch (Exception e)
{
log.error(e.Message);
}
}
令人惊讶的是我在调试模式下没有出错。但是当我运行应用程序时,我得到此页面无效错误
我还注意到,当我使用异步时,我需要返回一个值,但我在UploadFiles()
和AttachmentQ()
方法中没有任何返回值。
在使用不同的上下文时,能否帮助我如何处理对象。
谢谢
答案 0 :(得分:1)
根本不要使用async void
。
如果你想使用async / await模式,那么让你的方法返回Task
public async Task UploadFiles(List<IFormFile> files)