使用强类型创建下拉菜单
本文关键字:下拉菜单 创建 强类型 | 更新日期: 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.DropDownList
和Html.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;
}
如果我理解正确,您希望在下拉列表中显示文件名列表。让用户选择一个按钮,然后将该文件的内容显示给用户进行编辑和保存。
如果这是正确的,你应该做几件事 -
- 将包含文件名的选择列表传递给视图,然后填充下拉列表。
- 发回所选项目和另一个负责返回编辑视图的编辑 (GET) 操作方法。
- 将编辑的数据回发到编辑 (POST) 操作方法并保存更改。
如果这是正确的,我将发布一些代码。