我有一个列表,其中我使用Ajax为每条记录上传一个文件,但是因为我处于循环中并且我使用ID进行输入,所以只上传了第一条记录文件,其余记录没有上传。请检查代码
public class TaxParvande
{
public int id { get; set; }
public int projectId { get; set; }
public String projectName { get; set; }
public int listId { get; set; }
public int year { get; set; }
public bool state { get; set; }
[NotMapped]
public IFormFile? prosessMastand { get; set; }
public int prosessId { get; set; }
public String prosessName { get; set; }
public String FilePath { get; set; }
public String NaoaParvane { get; set; }
}
<form asp-controller="Tax" asp-action="SabtEditTaxParvanedAsync" method="post" enctype="multipart/form-data">
<div class="container-fluid" style="overflow: auto; overflow-x: hidden; direction:ltr ">
<table class="table table-bordered table-striped table-hover display" width="100%" style="direction:rtl;font-size:12px">
<thead>
<tr class="table-head-blue text-center" style="background-color: #416992; color: white; position: sticky; top: 0;">
<th style="width:150px">وضعیت</th>
<th>پروسه پرونده</th>
<th>مستندات</th>
<th>تاریخ</th>
</tr>
</thead>
@{ var count = 0;}
@for (var i = 0; i < Model.Count(); i++)
{
<tr>
<td style="width:150px">
<label class="switch">
<input type="checkbox" onchange="DisableRow(this)" asp-for="@Model.ToList()[i].state" value="True">
<span class="slider round"></span>
</label>
</td>
<td style="font-size: 12px">
<span>@Model.ToList()[i].prosessName</span>
<input class="d-none" value="@Model.ToList()[i].prosessName" name="[@i].prosessName" />
</td>
<td>
<div class="d-flex justify-content-around">
<div>
<span class="text-center mt-2" id="spnImageCartMlie" style="color: black;font-size: 12px"></span>
</div>
<div>
<input type="button" required onclick="UploadImage()" value="Upload" class="btn btn-outline-danger " id="btnUpLoad" />
<div id="divmessage" class="text-center hidden m-2"></div>
</div>
<input id="mostanadPath" name="[@i].prosessMastand" type="file" class="">
</div>
</td>
<td style="font-size: 12px" hidden>
<span>@Model.ToList()[i].prosessId</span>
<input class="d-none" value="@Model.ToList()[i].prosessId" name="[@i].prosessId" />
</td>
<td>
</td>
</tr>
count++;
}
</table>
</div>
<div class=" text-center">
<button class="btn btn-success col-4 mb-2 " type="submit">ثبت اطلاعات</button>
</div>
</form>
//--------------------------------------------------------------------------
[HttpPost]
public async Task<IActionResult> SabtEditTaxParvanedAsync([FromForm]IEnumerable<TaxParvande> taxParvandes)
{
if (taxParvandes == null)
{
return Content("File not selected");
}
foreach (var item in taxParvandes)
{
var path = Path.Combine(_webHostEnvironment.WebRootPath, "ListUpload", item.prosessMastand.FileName);
using (FileStream stream = new FileStream(path, FileMode.Create))
{
await item.prosessMastand.CopyToAsync(stream);
stream.Close();
}
var taxparvand = new TaxParvande
{
prosessId =item.prosessId,
prosessName = item.prosessName,
state = item.state,
FilePath = path,
};
_context.Add(taxparvand);
await _context.SaveChangesAsync();
}
return View();
}
更新:
根据您的评论,以下是完整视图以及其他说明:
@model IEnumerable< DotNet6MVCWebApp.Models.TaxParvande>
<form asp-controller="YourContorllerName" asp-action="SabtEditTaxParvanedAsync" method="post" enctype="multipart/form-data">
<div class="container-fluid" style="overflow: auto; overflow-x: hidden; direction:ltr ">
<table class="table table-bordered table-striped table-hover display" width="100%" style="direction:rtl;font-size:12px">
<thead>
<tr class="table-head-blue text-center" style="background-color: #416992; color: white; position: sticky; top: 0;">
<th style="width:150px">وضعيت</th>
<th>پروسه پرونده</th>
<th>مستندات</th>
<th>تاريخ</th>
</tr>
</thead>
@{
var count = 0;
}
@for (var i = 0; i < Model.Count(); i++)
{
<tr>
<td style="font-size: 12px" hidden>
<span>@Model.ToList()[i].prosessId</span>
<input class="d-none" value="@Model.ToList()[i].prosessId" name="[@i].prosessId" />
</td>
<td style="width:150px">
<label class="switch">
<input type="checkbox" onchange="DisableRow(this)" asp-for="@Model.ToList()[i].state" value="True">
<span class="slider round"></span>
</label>
</td>
<td style="font-size: 12px">
<span>@Model.ToList()[i].prosessName</span>
<input class="d-none" value="@Model.ToList()[i].prosessName" name="[@i].prosessName" />
</td>
<td>
<div class="d-flex justify-content-around">
<div>
<span class="text-center mt-2" id="spnImageCartMlie" style="color: black;font-size: 12px"></span>
</div>
<div>
<input type="button" required onclick="UploadImage()" value="Upload" class="btn btn-outline-danger " id="btnUpLoad" />
<div id="divmessage" class="text-center hidden m-2"></div>
</div>
<input id="mostanadPath" name="[@i].prosessMastand" type="file" class="">
</div>
</td>
<td>
</td>
</tr>
count++;
}
</table>
</div>
<div class=" text-center">
<button class="btn btn-success col-4 mb-2 " type="submit"> Submit ثبت اطلاعات</button>
</div>
</form>
IWebHost环境:
关于
_environment
上的错误,您可以替换为您的 constructor name
这个错误很明显,因为我们的构造函数名称不同。因为我保留了以下名称:
private readonly IWebHostEnvironment _environment;
您可以设置任何您方便的东西。
控制器名称:
即使您将
controller action
设置为 SabtEditTaxParvaned
它也会起作用,因为它会检查控制器中是否有任何 POST
方法。如果有很多 POST
动作,则不会起作用。不过,您可以将其替换为 SabtEditTaxParvanedAsync
之前的回答:
我有一个列表,其中使用 Ajax 为每条记录上传一个文件,但是 因为我在循环中并且我使用ID进行输入,只有第一条记录 文件已上传,其余记录未上传
根据您共享的代码,您似乎有两种情况
正如我所检查的那样,这似乎按预期工作。但是,对于
Single Upload
或 List Upload
,您应该需要对代码进行少量修改。请按照以下步骤操作:列表上传模型:
All Upload
正如你所说的public class TaxParvande
{
public IFormFile? prosessMastand { get; set; }
public int prosessId { get; set; }
public bool state { get; set; }
public string prosessName { get; set; }
}
因此,我添加了
"In a loop and I used ID for input"
,稍后我们将在prosessId
中使用它。控制器:
View
当您提交 [HttpPost]
public async Task<IActionResult> SabtEditTaxParvanedAsync([FromForm]IEnumerable<TaxParvande> taxParvandes)
{
if (taxParvandes == null)
{
return Content("File not selected");
}
foreach (var item in taxParvandes)
{
var path = Path.Combine(_environment.WebRootPath, "ListUpload", item.prosessMastand.FileName);
using (FileStream stream = new FileStream(path, FileMode.Create))
{
await item.prosessMastand.CopyToAsync(stream);
stream.Close();
}
var taxDomainModel = new TaxDomainModel
{
prosessId =item.prosessId,
prosessName = item.prosessName,
state = item.state,
FilePath = path,
};
_context.Add(taxDomainModel);
await _context.SaveChangesAsync();
}
return View();
}
时,我们应该将控制器重新定义为
FormData
和[FromForm]
列表。由于它是列表,因此我们循环遍历文件夹中的项目和IEnumerable<TaxParvande>
,最终得到saving image
,以便我们可以保存在数据库中。查看:在
path location
中,我们将修改两件事。
首先,对于View
我们应该使用这个属性
Multiple FromData
来一次性提交enctype="multipart/form-data"
。最终更改如下bulk file
其次, 为<form asp-controller="LoopUpload" asp-action="SabtEditTaxParvaned" method="post" enctype="multipart/form-data">
使用额外的一个
td
,并将prosessId
设置为attribute
,如下所示:hidden
注意:现在您已经完成了一起上传列表的操作。您可以看到下面的输出。 输出: