【问题标题】:No Data passed to IFormFile in .Net Core.Net Core 中没有数据传递给 IFormFile
【发布时间】:2021-01-30 21:34:48
【问题描述】:

在控制器中将数据传递给操作时遇到问题

    public class LeadFile : BaseEntity
     {
    public int LeadId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string FileType { get; set; }
    public byte[] DataFiles { get; set; }  ***********

    public Lead Lead { get; set; }

}

我的视图模型

    public class LeadFileViewModel
     {
    public int Id { get; set; }

    public string Description { get; set; }
    public string Name { get; set; }
    public string FileType { get; set; }
    public IFormFile DataFiles { get; set; }   ***********

    }

我使用这个扩展从 IFileForm 转换为 byte[]

    public static class FormFileExtensions
     {
    public static byte[] GetBytes(this IFormFile formFile)
       {
          using (var memoryStream = new MemoryStream())
          {
             formFile.CopyToAsync(memoryStream);
            return memoryStream.ToArray();
          }
      }
     }

这是我的观点

    @using (Html.BeginForm("AddFileTempItem", "Leads", FormMethod.Post, new
{

    id = "AddLeadFileForm",
    @enctype = "multipart/form-data",
    @data_ajax = "true",
    @data_ajax_method = "post",
    @data_ajax_update = "#FileInformatiomList",
    @data_ajax_failure = "onFailureDefault",

    @data_ajax_complete = "AddFileTempItemOnComplete"
}))
                <div class="row">
                <div class="col-sm-4">
                    <div class="form-group">
                        <label asp-for="DataFiles" class="control-label"></label>
                        <input asp-for="DataFiles" type="file" class="form-control" /> ***********
                    </div>
                </div>

                <div class="col-sm-4">
                    <div class="form-group">
                        <label asp-for="Name" class="control-label"></label>
                        <input asp-for="Name" class="form-control" />
                    </div>
                </div>
                <div class="col-sm-4">
                    <div class="form-group">
                        <label asp-for="Description" class="control-label"></label>
                        <input asp-for="Description" class="form-control" />
                    </div>
                </div>
            </div>
<div class="modal-footer">
    <input type="submit" value="Add File" class="btn btn-primary" />
    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>

还有这个控制器动作

        [HttpPost]
    public ActionResult AddFileTempItem(LeadFileViewModel model)
    {
        List<LeadFileViewModel> models = LeadFileViewModelsList;

        models.Add(new LeadFileViewModel
        {
            Id = models.Count + 1,
            Name = model.Name,
            DataFiles = model.DataFiles,
            Description = model.Description,
            FileType = model.FileType,

        });
        LeadFileViewModelsList = models;
        return PartialView("_LeadFilesGridPartial", LeadFileViewModelsList);
    }

我的问题是,当我单击添加按钮时,每次 null 时都没有数据传递给 viewModel 中的 DataFiles 属性。 任何人都可以帮助我解决这个问题。

谢谢

【问题讨论】:

  • 当我使用普通表单标签
    时它工作正常,但是当我使用 Html.BeginForm 时它不起作用,现在我确定 100% 来自 Html 中的 enctype 问题。 BeginForm,我也看过一些文章说你不能通过文件抛出ajax。我现在能做什么?

标签: .net asp.net-core


【解决方案1】:

尝试使用我之前关于通过 HTTP 传输文件的问题的答案。为了将文件(和一个对象中的其他信息)传输到控制器,我在 JS 中使用“FormData”类型。 资源地址:Ajax POST not hitting controller break point

第一个麻烦: 指令“使用不带花括号! 第二个麻烦: 如果您使用视图中的任何模型类,您应该分配这个类。

下面我用正确的“使用”指令格式粘贴视图代码:

@model LeadFileViewModel;
@{
    ViewData["Title"] = "Home Page";
}
<div class="text-center">
    @using (Html.BeginForm("AddFileTempItem", "Leads", FormMethod.Post, new
    {

        id = "AddLeadFileForm",
        @enctype = "multipart/form-data",
        @data_ajax = "true",
        @data_ajax_method = "post",
        @data_ajax_update = "#FileInformatiomList",
        @data_ajax_failure = "onFailureDefault",

        @data_ajax_complete = "AddFileTempItemOnComplete"
    }))
    {
        <div class="row">
            <div class="col-sm-4">
                <div class="form-group">
                    <label asp-for="DataFiles" class="control-label"></label>
                    <input asp-for="DataFiles" type="file" class="form-control" /> 
                </div>
            </div>

            <div class="col-sm-4">
                <div class="form-group">
                    <label asp-for="Name" class="control-label"></label>
                    <input asp-for="Name" class="form-control" />
                </div>
            </div>
            <div class="col-sm-4">
                <div class="form-group">
                    <label asp-for="Description" class="control-label"></label>
                    <input asp-for="Description" class="form-control" />
                </div>
            </div>
        </div>
        <div class="modal-footer">
            <input type="submit" value="Add File" class="btn btn-primary" />
            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        </div>
    }
</div>

【讨论】:

  • 我需要没有数据传递的原因来解决问题。
  • 列表“LeadFileViewModelsList”未签名!
  • 方法“GetBytes”从未在上面的代码中使用。
  • 所有数据传递到我的示例中的类中的字段,位于上方。
  • 问题是 HTML.Begin.Form 无法处理文件,我使用了 JavaScript 并且工作正常
【解决方案2】:

您是否通过表单提交发送数据?如果是,当您的表单包含任何&lt;input type="file"&gt; 元素时,您应该使用multipart/form-data

<form asp-action="AddFileTempItem" method="post" enctype="multipart/form-data">
    //...
</form

【讨论】:

  • 我更新了我的问题以查看完整的代码,我使用了 BeginForm HTML 辅助方法
  • 它可以在我身边工作。怎么提交表单,有提交按钮吗?
猜你喜欢
  • 2022-07-02
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2023-01-30
  • 2021-10-18
  • 2021-02-24
  • 1970-01-01
相关资源
最近更新 更多