Форма загрузки файла ASP.NET Core 2.1 не достигает контроллера - PullRequest
0 голосов
/ 06 ноября 2018

Это мой контроллер

[ValidateAntiForgeryToken]
[HttpPost("Save")]
public async Task<ActionResult> SaveAsync(UploadDocumentViewModel Input)
{
    var filePath = $"{this.hostingEnvironment.WebRootPath}/documents";
    foreach(var item in Input.Files)
    {
        var fileName = ContentDispositionHeaderValue.Parse(item.ContentDisposition).FileName;
        var fullFilePath = Path.Combine(filePath, fileName);
        using(var stream = new FileStream(fullFilePath, FileMode.Create))
        {
            await item.CopyToAsync(stream);
        }
    }
    return this.Ok();
}

Это форма, которую я загружаю с

@using (Html.BeginForm("Save", @ViewContext.RouteData.Values["controller"].ToString(), FormMethod.Post, new { enctype = "multipart/form-data",id = "form" }))
{
    @Html.AntiForgeryToken()
    <div class="col-sm-12">
        <div class="row">
            <div class="col-sm-12">
                <div class="form-group">
                    @Html.LabelFor(m => m.Categories)
                    @Html.DropDownListFor(m => m.Categories, (SelectList)Model.Categories, "", new { @class = "form-control col-sm-12" })
                    @Html.ValidationMessageFor(m => m.Categories)
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-12">
                <div class="form-group">
                    <input id="Files" type="file" name="Files" multiple />
                </div>
            </div>
        </div>
        <div class="row">
            <div class="col-sm-12">
                <hr />
            </div>
        </div>
        <div class="row">
            <div class="col-sm-12">
                <div class="form-group">
                    <div class="clearfix">
                        <div class="pull-right">
                            <input type="submit" id="submit" value="Save" class="btn btn-primary" />
                            @Html.ActionLink("Cancel", "Index", @ViewContext.RouteData.Values["controller"].ToString(), new { }, new { @class = "btn btn-outline-secondary" })
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
}

Когда я пытаюсь загрузить свой файл, меня переводят на страницу 404. Однако, если я удалю асинхронные элементы Задачи из моего контроллера, я смогу нормально добраться до контроллера. Я пытаюсь следовать этому руководству Microsoft, но не могу заставить его работать: https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.1

1 Ответ

0 голосов
/ 06 ноября 2018

Ваша форма пытается сгенерировать маршрут для действия "Save", но ваше имя действия на самом деле SaveAsync. Это сработало, когда вы удалили асинхронный материал, потому что вы, вероятно, также изменили имя метода на Save в тот момент.

Не принято называть действия суффиксом Async, даже если они асинхронные (в отличие от других типов методов). В результате я бы рекомендовал просто удалить часть Async имени метода, и все будет в порядке. В противном случае вам нужно изменить ссылку в форме с «Сохранить» на «SaveAsync», чтобы соответствовать названию действия.

FWIW, вы убиваете себя, используя HtmlHelper методы здесь. Вместо этого используйте помощники тегов. Например, ваш запрос может быть простым:

<form method="post" asp-action="Save" enctype="multipart/form-data">
    ...
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...