Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理页面中的input=file/ifformfile双向绑定_C#_Arrays_Asp.net Core_Razor Pages_Iformfile - Fatal编程技术网

C# 如何处理页面中的input=file/ifformfile双向绑定

C# 如何处理页面中的input=file/ifformfile双向绑定,c#,arrays,asp.net-core,razor-pages,iformfile,C#,Arrays,Asp.net Core,Razor Pages,Iformfile,我有一个实体,它的字节[]将徽标作为varbinary存储在数据库中。但是为了在Razor页面上使用这个模型,我扩展了它并添加了一个IFormFile属性来接收上传的文件 public class Company { public string Name { get; set; } public byte[] Logo { get; set; } } 在一种方法中,我从数据库中获取该公司,并相应地设置该文件: var response = await _companyServ

我有一个实体,它的字节[]将徽标作为varbinary存储在数据库中。但是为了在Razor页面上使用这个模型,我扩展了它并添加了一个IFormFile属性来接收上传的文件

public class Company
{ 
    public string Name { get; set; }
    public byte[] Logo { get; set; }
}
在一种方法中,我从数据库中获取该公司,并相应地设置该文件:

var response = await _companyService.GetByIdAsync(id);
if (response != null)
{
    if (response.Logo != null)
    {
        using (var stream = new MemoryStream(response.Logo))
        {
            var formFile = new FormFile(stream, 0, stream.Length, response.Name, response.Name);
            formFile.Headers = new HeaderDictionary()
            {
                new KeyValuePair<string, StringValues>("Content-Disposition", $"form-data; name=\"Company.UploadedLogo\"; filename=\"{response.Name}.png\""),
                new KeyValuePair<string, StringValues>("Content-Type", "image/png"),
            };
            response.UploadedLogo = formFile;
        }
    }

    return response;
}
var response=await _companyService.GetByIdAsync(id);
if(响应!=null)
{
如果(response.Logo!=null)
{
使用(var stream=newmemoryStream(response.Logo))
{
var formFile=new formFile(stream,0,stream.Length,response.Name,response.Name);
formFile.Headers=newheaderDictionary()
{
新的KeyValuePair(“Content Disposition”,$”表单数据;名称=\“Company.UploadedLogo\”文件名=\“{response.name}.png\”),
新的KeyValuePair(“内容类型”、“图像/png”),
};
response.UploadedLogo=formFile;
}
}
返回响应;
}
上传的logo被填充,我把它绑定到Razor页面上

<form method="post"
      enctype="multipart/form-data"
      data-ajax="true"
      data-ajax-method="post"
      data-ajax-begin="begin"
      data-ajax-complete="completed"
      data-ajax-failure="failed">
    ...
    <div class="form-group row"> 
        <div class="col-sm-2 text-right">
            <label asp-for="@Model.Company.Logo" class="col-form-label"></label>
        </div>
        <div class="col-sm-9">
            <input type="file" class="dropify" data-height="200"
                   asp-for="@Model.Company.UploadedLogo"
                   data-max-file-size="100K" data-allowed-file-extensions="png jpg jpeg" />
        </div>
    </div>
    ...
    <div class="form-group modal-actions">
        <input type="submit" class="btn btn-primary btn-icon-text btn-md btn-save-editing" value="Save" />
    </div>
</form>

...
...
顺便说一下,我正在使用as文件上传插件和库来处理post请求。以下是post方法:

public async Task<CompanyModel> OnPostAsync(CompanyModel company)
{
    CompanyModel result = new CompanyModel();

    try
    {
        if (company.UploadedLogo != null)
            company.Logo = await company.UploadedLogo.GetBytes();

        var response = await _companyService.SaveAsync(company);
        if (response != null)
            result = response;
    }
    catch (Exception ex)
    {
        _Logger.LogException(ex);
    }

    return result;
}
PostAsync上的公共异步任务(CompanyModel company) { CompanyModel结果=新的CompanyModel(); 尝试 { 如果(company.UploadedLogo!=null) company.Logo=等待company.UploadedLogo.GetBytes(); var response=await_companyService.SaveAsync(公司); if(响应!=null) 结果=响应; } 捕获(例外情况除外) { _Logger.LogException(ex); } 返回结果; } 下面是一个场景:

  • 当我添加新公司时,我输入公司名称并从计算机浏览文件,然后保存数据。我可以在post请求中看到公司模型中上传的徽标,然后将其转换为字节[],并保存在数据库中。一切都很好。以下是小提琴手的抓拍:
  • 当我试图编辑公司时,问题开始出现。我打开公司,服务获取数据,将字节[]转换为文件,数据(名称+徽标)显示在表单上。我只是编辑名称,不要触摸徽标,让它保持原样,然后点击save。此时,在post请求中收到的公司模型中,上传的徽标为空。以下是小提琴手的抓拍:
我可以清楚地看到发布的请求捕获中的差异。在编辑的情况下,文件不在那里。但我不知道如何解决这个问题。这一天我在这件事上伤了脑筋,有人能帮我吗


更新:还添加了fiddler捕获。

我知道这不是最好的解决方案,但我成功地解决了它


我所做的是,我将图像字节转换为图像的base64数据uri,并将uri保存在输入[hidden]中。我还添加了另一个输入[hidden]来保存标志,该标志表示用户是否更改了徽标。当用户更改徽标时,我会使用上传图像的新base64数据uri和flag=true更新这些隐藏字段。如果用户不更改图像,则uri相同,且flag=false。现在保存时,我得到uri字符串和标志。如果标志为true,我将uri转换为图像并将其保存在数据库中。

我知道这不是最好的解决方案,但我成功地解决了它


我所做的是,我将图像字节转换为图像的base64数据uri,并将uri保存在输入[hidden]中。我还添加了另一个输入[hidden]来保存标志,该标志表示用户是否更改了徽标。当用户更改徽标时,我会使用上传图像的新base64数据uri和flag=true更新这些隐藏字段。如果用户不更改图像,则uri相同,且flag=false。现在保存时,我得到uri字符串和标志。如果标志为true,我将uri转换为图像并将其保存在数据库中。

如果UploadedLogo从UI中显示为null,则不应在数据库中更新它。我想到了这个解决方案,但这将是我最后的优先事项。因为我使用的是通用存储库模式,所以我不想做这样的事情。另外,我还有很多其他页面都有这种情况,因此我不想使用通用模式,也不想在代码中专门为此目的添加if-else。如果UploadedLogo在UI中为null,则不应该在数据库中更新它。我想到了这个解决方案,但这将是我最后的优先事项。因为我使用的是通用存储库模式,所以我不想做这样的事情。另外,还有很多其他页面上我有这个场景,所以不使用通用模式和在代码中专门为此目的添加if-else不是我想要的。
public async Task<CompanyModel> OnPostAsync(CompanyModel company)
{
    CompanyModel result = new CompanyModel();

    try
    {
        if (company.UploadedLogo != null)
            company.Logo = await company.UploadedLogo.GetBytes();

        var response = await _companyService.SaveAsync(company);
        if (response != null)
            result = response;
    }
    catch (Exception ex)
    {
        _Logger.LogException(ex);
    }

    return result;
}