Данные, размещенные через форму, вешают заявку - PullRequest
0 голосов
/ 08 марта 2019

У меня есть простой метод контроллера, как это:

[Authorize]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Add(InputModel input, OtherInputModel[] input2)
{
    (...)
}

Который получает данные из этой формы ниже, но проблема в том, что когда эта простая конечная точка получает OtherInputModel[], затем он зависает после нажатия кнопки «Отправить»

Там нет ошибки или что-то вообще - он просто застрял, пытаясь ввести этот метод контроллера, даже если я не прикрепляю изображения.

Изменение OtherInputModel[] на string[] «решает» его, поэтому по-прежнему можно получить доступ к этому методу, но я хочу отправить сложную модель []

<form asp-action="Add" method="post" enctype="multipart/form-data">
    <div class="form-group">
        <label class="control-label">Title</label>
        <input name="input.Title" class="form-control" value="@Model.Title" />
        <span class="text-danger"></span>
    </div>

    <div class="form-group">
        <label class="control-label">Body</label>
        <input name="input.Body" class="form-control" value="@Model.Body" />
        <span class="text-danger"></span>
    </div>

    <div class="form-group">
        <div class="col-md-10">
            <p>Upload one image ("jpg", "jpeg", "png", "bmp") using this form:</p>
            <input type="file" name="input.Image" />
        </div>
    </div>

    // here's probably the problem

    @for (int i = 0; i < 4; i++)
    {
        <div class="form-group">
            <label class="control-label"></label>
            <input name="input2[].Text" class="form-control" />
            <span class="text-danger"></span>
        </div>

        <div class="form-group">
            <div class="col-md-10">
                <p>Upload one image ("jpg", "jpeg", "png", "bmp") using this form:</p>
                <input type="file" name="input2[].Image" />
            </div>
        </div>
    }

    <div class="form-group">
        <input type="submit" value="Create" class="button" />
    </div>
</form>

Вот мои модели:

public class InputModel
{
    public string Title { get; set; }
    public string Body { get; set; }
    public IFormFile Image { get; set; }
}

public class OtherInputModel
{
    public string Text { get; set; }
    public IFormFile Image { get; set; }
}

Я также пытался использовать индексы в своей форме, как это

<input name="input2[@i].Text" class="form-control" />

1 Ответ

0 голосов
/ 08 марта 2019

Это похоже на глупую ошибку в ASP.NET Core 2.2. Нет ничего общего с front-end, это связано с тем, что действие ожидает массив сложных объектов, содержащих IFormFile, и привязка модели переходит в бесконечный цикл (но он отлично работает в ASP.Core 2.1)

Вот и выдает на github по поводу этой ошибки. Он уже закрыт и, похоже, исправлена ​​ошибка в ASP.NET Core 3.

Однако есть несколько обходных путей.

1. Поместите скрытый ввод с objectName.Index именем и значением индекса

<input type="hidden" name="otherinput.Index" value="0" />
<input type="file" name="otherinput[0].Image" />

Работает нормально, но если кто-то запросит без ввода otherinput.Index (через почтальона или удалив input перед отправкой), приложение будет зависать, как и без этого обходного пути. Так что, я бы сказал, это очень хрупко и неприемлемо.

2. Оберните IFormFile в класс

public class OtherInputModel
{
    public string Text { get; set; }

    public string Body { get; set; }

    public FileHolder Holder { get; set; }
}

public class FileHolder
{
    public IFormFile Image { get; set; }
}

и разметка

<input name="otherinput[0].Text" class="form-control" value="create btn" />
<!-- second line won't work by itself, first line with Text or Body property is required -->
<input type="file" name="otherinput[0].Holder.Image" />

Работает нормально, но люди говорят о возможных утечках памяти, описанных в этом выпуске .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...