使用强类型来制作下拉菜单

时间:2013-10-24 13:55:42

标签: c# asp.net-mvc

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

3 个答案:

答案 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)

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

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

  1. 将带有文件名称的SelectList传递给视图和 填充下拉列表。
  2. 发送回所选项目和另一个负责返回编辑视图的编辑(GET)操作方法。
  3. 将编辑后的数据回发到编辑(POST)操作方法并保存更改。
  4. 如果这是对的,我会发布一些代码。

答案 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;
}