0

我试图让用户在下拉菜单中选择不同的名称,从计算机上的文件夹中使用。在他们选择了一些东西后,他们应该能够点击一个按钮,然后能够编辑文件。我试图避免只使用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.DropDownListand Html.DropDownListFor(有什么区别?),但似乎没有任何效果。这可能只是我缺少的一些愚蠢的东西,但是我会很高兴得到一些帮助。

4

3 回答 3

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)
于 2013-10-24T14:36:37.917 回答
1

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

如果这是正确的,你应该做一些事情 -

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

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

于 2013-10-24T14:36:47.627 回答
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;
}
于 2013-10-24T14:44:35.960 回答