我试图让用户在下拉菜单中选择不同的名称,从计算机上的文件夹中使用。在他们选择了某些东西之后,他们应该能够点击一个按钮然后能够编辑该文件。我试图避免使用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
(有什么区别?),但似乎没有任何效果。这可能只是我想念的傻事,但是我会很乐意得到一些帮助。
答案 0 :(得分:2)
我建议您使用视图模型。首先定义一个:
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)
答案 1 :(得分:1)
如果我理解正确,您想在下拉列表中显示文件名列表。让用户选择一个,单击一个按钮,然后将该文件的内容呈现给用户进行编辑和保存。
如果这是正确的,你应该做一些事情 -
如果这是对的,我会发布一些代码。
答案 2 :(得分:1)
首先,传递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;
}