使用强类型创建下拉菜单

本文关键字:下拉菜单 创建 强类型 | 更新日期: 2023-09-27 18:36:53

我试图让用户在下拉菜单中的不同名称之间进行选择,从计算机上的文件夹中使用。在他们选择了一些东西之后,他们应该能够点击一个按钮,然后能够编辑文件。我试图避免只使用ViewBag.

我的控制器(将正确的数据返回到FormCollection(应该是FormCollection吗?

public ActionResult Index()
{
    FormCollection tableNames = TableNames();
    return View("Index",tableNames);
}
public FormCollection TableNames()
{
    String[] tableNamesPath = Directory.GetFiles(@"C:'Something'");
    FormCollection form = new FormCollection();
    foreach(String tableName in tableNamesPath)
    {
        form.Add(Path.GetFileName(tableName), Path.GetFileName(tableName));
    }
    return form;
}

基本上我什么都没有,我试图使用Html.DropDownListHtml.DropDownListFor(有什么区别?),但似乎没有任何效果。这可能只是我错过了一些愚蠢的东西,但是我会很高兴得到一些帮助。

使用强类型创建下拉菜单

我建议您使用视图模型。因此,首先定义一个:

public class TableViewModel
{
    public string SelectedItem { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

然后让控制器将此视图模型传递给视图:

public ActionResult Index()
{
    var tableNames = TableNames();
    return View("Index", tableNames);
}
public TableViewModel TableNames()
{
    String[] tableNamesPath = Directory.GetFiles(@"C:'Something'");
    TableViewModel model = new TableViewModel();
    model.Items = tableNamesPath.Select(item => new SelectListItem
    {
        Value = Path.GetFileName(item),
        Text = Path.GetFileName(item),
    }).ToList();
    return model;
}

然后,使视图强类型化到此视图模型,您将能够使用强类型的 DropDownListFor 帮助程序:

@model TableViewModel 
@Html.DropDownListFor(x => x.SelectedItem, Model.Items)

首先,传递 FormCollection 基本上是错误的。FormCollection用于循环访问表单的所有后值。

我认为您对MVC基本方法的理解是错误的。您要实现的是编辑文件。所以你的模型应该是一个名为 FileModel 的类。控制器应如下所示:

[HttpGet]
public ActionResult Index()
{
    return View("Index", new FileModel());
}

这将提供一个视图,绑定到FileModel的新实例。在下一步中,您要选择要编辑的文件的文件名。这意味着,您的FileModel将获得一个名为 FileName 的属性,该属性将在下一步中分配。

public class FileModel
{
    [Required]
    public string FileName { get; set; }
}

我们现在有了模型控制器。缺少的是视图部分。这是实际负责用户交互的部分。如何选择文件不是控制器的责任,因此应从视图中完成构建下拉列表。在我看来,控制器甚至不应该知道下拉菜单用于选择文件名。

@model FileModel
@using (Html.BeginForm())
{
    <fieldset>
        <ol>
            <li>
                @Html.LabelFor(m => m.FileName)
                @Html.DropDownListFor(m => m.FileName)
                @Html.ValidationMessageFor(m => m.FileName)
            </li>
        </ol>
        <input type="submit" value="Edit file" />
    </fieldset>
}

DropDownListFor只是告诉视图,FileName的编辑器模板不是一个简单的文本框,而是一个下拉列表。现在最后一步是填写下拉列表的选项。因此,我们可以使用 重载 DropDownListFor .

@Html.DropDownListFor(m => m.FileName, 
    new SelectList(Directory.GetFiles(@"C:'Something'"))

现在,您应该能够从目录中选择一个文件。可以从 post 方法在控制器中读取此选择:

[HttpPost]
public ActionResult Index(FileModel model)
{
    var selectedFileName = model.FileName;
}

如果我理解正确,您希望在下拉列表中显示文件名列表。让用户选择一个按钮,然后将该文件的内容显示给用户进行编辑和保存。

如果这是正确的,你应该做几件事 -

  1. 将包含文件名的选择列表传递给视图,然后填充下拉列表。
  2. 发回所选项目和另一个负责返回编辑视图的编辑 (GET) 操作方法。
  3. 将编辑的数据回发到编辑 (POST) 操作方法并保存更改。

如果这是正确的,我将发布一些代码。