0

假设我想上传一些文件。

我在 Razor 视图中的 HTML 表单如下所示:

@model SequereMe.Onboarding.Web.ViewModels.Branding.TenantBrandingViewModel
@{
}

<form asp-controller="BrandingSettings" asp-action="Save" asp-method="post" enctype="multipart/form-data">
    <div class="form-group">
        <input asp-for="TenantId" value=@Model.TenantId />
    </div>
    <div class="form-group">
        <label for="logoFileUrl">Logo File Upload:</label>
        <input asp-for="LogoFile" type="file" class="form-control-file" id="logoFileUrl" aria-describedby="fileHelp">
        <h1>@Model.LogoFileUrl</h1>
    </div>
    <div class="form-group">
        <label for="backgroundFileUrl">Background File Upload:</label>
        <input asp-for="BackgroundFile" type="file" class="form-control-file" id="backgroundFileUrl" aria-describedby="fileHelp">
        <h1>@Model.BackgroundFileUrl</h1>
    </div>
    <button type="submit" class="btn btn-primary">Save</button>
</form>

此 HTML 表单在提交时将触发的控制器操作是此 Web 控制器操作:

public async Task<IActionResult> Save(TenantBranding tenantBranding)
{
    var result =
        await _apiClient.PostAsync("/BrandingSettings", tenantBranding);

    switch (result.Status)
    {
        case HttpStatusCode.NotFound:
        case HttpStatusCode.BadRequest:
            return new RedirectResult("~/Error/404");
        case HttpStatusCode.OK:
            //return View("Edit", result.Message.Content);
        default:
            return new RedirectResult("~/Error/500");
    } 
}

我进一步使用 Pathoschild.Http.Client.IClient 接口的 FluentClient 实现对此 Post 方法进行 API 调用:

[HttpPost]
public async Task<IActionResult> Post([FromBody] TenantBranding tenantBranding)
{
    if (tenantBranding == null)
    {
        return new BadRequestObjectResult("Invalid Parameter: The incoming tenantBranding parameter is null");
    }

    if (tenantBranding.TenantId == Guid.Empty)
    {
        return new BadRequestObjectResult("Invalid Parameter: The tenantId in the incoming parameter tenantBranding is empty");
    }

    var result = _brandingLogic.Save(tenantBranding).Result;

    if (!result)
    {
        return new JsonResult(500);
    }
    return Ok(); 
}

由于某种奇怪的原因tenantbranding,Api Post 方法中的参数为空。从 Web Controller 到 Api Controller 的 ModelBinding 有问题。

这就是我的 TenantBranding 模型(Api)的样子:

public class TenantBranding
{
    public Guid TenantId { get; set; }
    public IEnumerable<FormFile> LogoFile { get; set; }
    public IEnumerable<FormFile> BackgroundFile { get; set; }
    public string DocumentType { get; set; }
}

这就是我在 Web 中的 TenantBranding 的样子:

public class TenantBranding
{
    public Guid TenantId { get; set; }
    public IFormFile LogoFile { get; set; }
    public IFormFile BackgroundFile { get; set; }
}

但是tenantBrandingAPI方法中的参数显示为null,所以我不知道为什么会这样?可能与它有关IFormFile吗?

4

1 回答 1

0

首先尝试将名称属性添加到您的输入中。

<input asp-for="BackgroundFile" type="file" name="BackgroundFile" class="form-control-file" id="backgroundFileUrl" aria-describedby="fileHelp">

但我建议您采用其他方式并为您的 api 控制器使用 ajax 请求:

$(form).on("submit", function(){
    $.ajax({
       url:"api/controller/action",
       type:"POST",
       //here will be your data from FORM
       data:{
                TenantId:$("#tenantid input id").val(),
                LogoFile :$("#LogoFile input id").val(),
                BackgroundFile :$("#BackgroundFile input id").val(),                
            },
      content-type:"application/json",
      success:function(response){// do on success},
      error:function(){// do somesthig on error}
    });
})

当您提交表单时,js 会向 api 控制器发送 post 请求。这是使用 WebApi 的更好方法。

于 2017-09-11T15:35:16.587 回答