Создание списка в модале с файлами из каталога? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь получить файлы из каталога и пытаюсь позволить пользователю выбрать файл из списка для последующей обработки.

Это код, который получает файлы.

    [HttpGet]
    public ActionResult GetFiles()
    {
        DirectoryInfo dinfo = new DirectoryInfo(@"C:\TestDirectory");
        List<FileInfo> Files = dinfo.GetFiles("*.txt").ToList();

        return PartialView("_File", Files);
    }

И это частичное представление, которое сейчас будет в модале.

@model List<FileInfo>

@Html.ListBoxFor(model => model, new SelectList(Model).AsEnumerable())

Как я вызываю частичное представление из основного вида:

<div class="row">
<div class="modal fade" id="bootstrapDialog" tabindex="-1" role="dialog" aria-labelledby="myModal-label" aria-hidden="true"></div>
</div>

<div class="btn btn-default browseButton">
<span class="glyphicon glyphicon-folder-open browseDialog" data-url="@Url.Action("GetFiles","Home", null)"></span> 
<span class="browseDialog" data-url="@Url.Action("GetFiles","Home", null)">Browse...</span>
</div>

@section scripts {
<script>
       $(document).ready(function () {

        $('.browseDialog').click(function () {

            var url = $(this).data('url');

            $.get(url, function (data) {

                $('#bootstrapDialog').html(data);

                $('#bootstrapDialog').modal('show');

            });

        });
   });

</script>
}

Информация о файле извлекается, но список не создается.Окно списка дает исключение, что значение не может быть нулевым или пустым.Нужно ли создавать что-то еще, что должно быть передано в этот список?

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

1 Ответ

0 голосов
/ 23 октября 2018

Использование @model List<FileInfo> и new SelectList(Model).AsEnumerable() кажется неправильным, так как вы не указываете текст и значение для заполнения в списке.Вы должны создать модель представления с настройкой, подобной этой:

public class ViewModel
{
    // other properties

    public string SelectedFile { get; set; }

    // options list
    public IEnumerable<SelectListItem> FilesList { get; set; }
}

Затем в действии вашего контроллера создайте List<SelectListItem> экземпляр из List<FileInfo>, используя Select() метод расширения и выборСвойство Name как текст опции, так и значение:

[HttpGet]
public ActionResult GetFiles()
{
    DirectoryInfo dinfo = new DirectoryInfo(@"C:\TestDirectory");
    List<FileInfo> Files = dinfo.GetFiles("*.txt").ToList();

    var model = new ViewModel();

    // use file name to generate option list
    model.FilesList = Files.Select(x => new SelectListItem { Text = x.Name, Value = x.Name }).ToList();

    return PartialView("_File", model);
}

Наконец, создайте помощник DropDownListFor со списком, заполненным из свойства FilesList:

@model ViewModel

@Html.DropDownListFor(model => model.SelectedFile, Model.FilesList, ...)

После этого вы можетеполучить выбранный файл, используя свойство string, упомянутое выше, например Server.MapPath().

Дополнительные примечания:

Если вы хотите выбрать несколько имен файлов, а неодно имя файла, затем используйте свойство IEnumerable<string> вместе с ListBoxFor помощником:

ViewModel

public IEnumerable<string> SelectedFiles { get; set; }

View

@Html.ListBoxFor(model => model.SelectedFiles, Model.FilesList, ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...