Использование @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, ...)