Как передать модель плюс дополнительный параметр из вида в контроллер - PullRequest
0 голосов
/ 25 февраля 2020

Используя ASP. NET MVC, на мой взгляд, я перечисляю некоторые файлы и показываю их как кнопку. При нажатии на каждую кнопку необходимо загрузить соответствующий файл.

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

Я нашел ответы на похожий вопрос, но в моем случае у меня нет только одной кнопки. У меня есть одна кнопка для каждого имени файла, которое я отображаю при просмотре.

Это код моего представления:

@using (Html.BeginForm("DownloadFile", "SharedFolder", FormMethod.Post))
{
    <div class="col-sm-6">
        <div class="panel panel-info">
            <div class="panel-heading">Files</div>
            <div class="panel-body" style="max-height:300px; height:300px; overflow-y:scroll">
                @foreach (var file in Model.Files)
                {
                    <button type="button" class="btn btn-link btn-sm" onclick="location.href='@Url.Action("DownloadFile", "SharedFolder", new { fileToDownload = file, data = Model })'">
                        <div class="glyphicon glyphicon-file" style="color:dodgerblue">
                            <span style="color:black;">@file</span>
                        </div>
                    </button>
                    <br />
                }
            </div>
        </div>
    </div>
}

И действие моего контроллера:

    [HttpPost]
    public ActionResult DownloadFile(string fileToDownload, FolderExplorerViewModel data)
    {
        // download the file and return Index view
        return RedirectToAction("Index");
    }

Когда я нажимаю на файл, чтобы загрузить его, я получаю сообщение об ошибке ниже:

Ресурс не может быть найден.

Запрошенный URL: / SharedFolder / DownloadFile

Обновление:

Это моя ViewModel

public class FolderExplorerViewModel
{
    public int ID { get; set; }
    public List<Folder> Folders { get; set; }
    public List<string> Files { get; set; }
    public string SelectedPath { get; set; }
}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Причина, по которой вы получаете эту ошибку, заключается в том, что она пытается выполнить публикацию формы, и отсутствуют элементы формы html, представляющие fileToDownload и данные.

На самом деле, вместо использования формы POST вы можете использовать якорные теги, вызывающие действие контроллера GET (поскольку он просто загружается, здесь не нужно использовать POST). Как упоминалось в @Phong, используя fileToDownload, вы, вероятно, можете получить другую информацию, необходимую для перенаправления в Index.

@foreach (var file in Model.Files)
{
    <a href='@Url.Action("DownloadFile", "SharedFolder", new { fileToDownload = file})' title="Click here to download the file">@file</a>
}

и тогда действие вашего контроллера будет:

public ActionResult DownloadFile(string fileToDownload)
{
    // do the stuff
    // download would return FileResult on success, not sure what you meant by RedirectToAction("Index")
    // download the file and return Index view
    return RedirectToAction("Index");
}

Если вы все еще хотите отправить модель, то вы можете сделать это с помощью javascript события нажатия кнопки с ajax .

0 голосов
/ 25 февраля 2020

Вы не должны хранить data = Model, так как это вызывает проблемы с производительностью и безопасностью.

Вы просто сохраняете одно значение fileToDownload из View. После этого в Контроллере Вы должны получить файл по fileToDownload param.

[HttpPost]
public ActionResult DownloadFile(string fileToDownload)
{
    // download the file by `fileToDownload` param here

    return RedirectToAction("Index");
}
...