我有一个列表,其中我使用AJAX for each 记录上传一个文件,但是因为我在一个循环中,并且我使用ID作为输入,所以只有第一个记录文件被上传,其余的记录不被上传.

我有一个列表,其中我使用AJAX for each 记录上传一个文件,但是因为我在一个循环中,并且我使用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();
    }

enter image description here

推荐答案

Update:

根据您的 comments ,以下是完整的视图以及其他解释:

@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>

IWebHostEnvironment:

关于_environment上的错误,您可以将其替换为constructor name.这个错误很明显,因为我们的构造函数名称不同.因为我保留了下面的名字:

 private readonly IWebHostEnvironment _environment;

你可以为你设置任何方便的东西.

Controller Name:

即使您将controller action设置为SabtEditTaxParvaned,它也会正常工作,因为它将判断控制器中是否有任何POST方法.如果有许多POST个动作,它就不会起作用.但是,您可以将其替换为SabtEditTaxParvanedAsync

Previous Answer:

我有一个使用AJAX for each 记录上传文件的列表,但是 因为我在一个循环中,并且我使用ID作为输入,所以只有第一条记录 文件已上载,其余记录未上载

根据您共享的代码,您似乎有两种情况

  1. 点击上载按钮时单次上载
  2. 当单击提交按钮时,所有内容一起上载

我判断了Single Upload个,看起来像预期的那样工作.但是,对于List UploadAll Upload,您应该几乎不需要在代码中进行修改.请按照以下步骤操作:

Model For List 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中使用它.

Controller:

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

Note:由于您提交的是FormData,因此我们应该将控制器重新定义为[FromForm],并重新定义IEnumerable<TaxParvande>的列表.因为它是列表,因此,我们正在循环通过项目和saving image在文件夹中,最终获得path location,以便我们可以保存在数据库中.

View:

View年里,我们将修改两件事.

Firstly,对于Multiple FromData,我们应该使用此属性enctype="multipart/form-data"来一次提交bulk file.最终更改如下

<form asp-controller="LoopUpload" asp-action="SabtEditTaxParvaned" method="post" enctype="multipart/form-data">

Secondly,prosessId加1 td,将attribute设置为hidden,如下所示:

  <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>

Note:你们现在可以一起上传一份名单了.您可以看到下面的输出.

输出:

enter image description here

Jquery相关问答推荐

JQuery:$.get 不是函数

jQuery 上传进度和 AJAX 文件上传

动态加载 css 样式表在 IE 上不起作用

在 div 中找到第一次出现的类

jQuery中的正则表达式字段验证

为什么要两次声明 jQuery?

jQuery UI 对话框 - 关闭后不打开

jQuery淡出不显示无?

在不使用提交按钮的情况下触发标准 HTML5 验证(表单)?

jQuery - 用 DIV 跟随光标

将返回的 JSON 对象属性转换为(较低的第一个)camelCase

使用 JQuery 获取触发事件的元素的类

消除移动 Safari 中点击事件的 300 毫秒延迟

如何在新窗口中打开链接?

在 bootstrap 弹出窗口中包含表单?

如何通过jQuery函数仅获取直接子元素

jQuery slideUp().remove() 在删除发生之前似乎没有显示 slideUp 动画

如何在没有鼠标事件的情况下在 jQuery 中获取鼠标位置?

bootstrap 日期和时间 Select 器

使用 JQuery 判断组中是否没有选中单选按钮