ASP.NET MVC 通过 ViewBag 填充 DropDown

ASP.NET MVC Populate DropDown thru ViewBag

我是 ASP.NET MVC 技术的初学者。 在我的视图页面中,我有一个绑定到从控制器传递的数据的 WebGrid。我还想用数据库中的表列表填充下拉列表。我从辅助方法中检索 tables 列表。我正在尝试将列表发送到 ViewBag 并想要填充下拉列表;但无法得到它。只是出现一些语法错误或列表不可访问。

我的控制器class:

        [Authorize]
    public ActionResult Index(int page = 1, string sort = "FirstName", string sortdir = "asc", string search = "")
    {
        int pageSize = 10;
        int totalRecord = 0;
        if (page < 1)
            page = 1;
        int skip = (page * pageSize) - pageSize;
        var data = GetUsers(search, sort, sortdir, skip, pageSize, out totalRecord);

        // Get Tables List
        ViewBag.TableList = DataFiller.GetTableNames();
        ViewBag.TotalRows = totalRecord;

        return View(data);
    }

查看文件:

@model List<DataStudio.Models.User>

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_MemberLayout.cshtml";

<!-- data is used for grid -->
var grid = new WebGrid(canPage: true, rowsPerPage: 10);
grid.Bind(source: Model, rowCount: ViewBag.TotalRows, autoSortAndPage: false);   
}

<!-- ERROR LINE   -->
@Html.DropDownList("tableName", @ViewBag.TableList, "Select Table")

错误

Error   CS1973  'HtmlHelper<List<User>>' has no applicable method named 'DropDownList' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.    1_Views_Member_Index.cshtml Index.cshtml    82  Active

User 模型不包含任何 List 或任何 DropDownList。下拉列表是一个完全独立的组合框,我想用一个列表项填充它;它仅包含来自数据库的 table 姓名列表。

我无法了解如何使用 SelectLiteItem 项目绑定或填充下拉列表。我在谷歌上搜索了很多,但找不到任何关于这种情况的例子。我不想将我的列表添加到我的模型中。而且,我只想在表格列表下拉列表中填充一次。

任何人都可以帮助我并指导我如何实现目标。非常感谢任何帮助。

谢谢

汤姆

更新: DataFilter.GetTableNames() 方法

       public static List<SelectListItem> GetTableNames()
    {
        List<SelectListItem> tablesList = new List<SelectListItem>();

        string sql = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'";
        string conStr = System.Configuration.ConfigurationManager.ConnectionStrings["DMSDbConnectionString"].ToString();

        using (SqlConnection con = new SqlConnection(conStr))
        {
            using (SqlCommand com = new SqlCommand(sql, con)) {
                con.Open();
                using(SqlDataReader sdr = com.ExecuteReader() )
                {
                    while (sdr.Read())
                    {
                        tablesList.Add(new SelectListItem
                        {
                            Text = sdr["TABLE_NAME"].ToString(),
                            Value = sdr["TABLE_NAME"].ToString()
                        });
                    }
                }

                /*
                SqlDataAdapter da = new SqlDataAdapter(com);
                DataSet ds = new DataSet();
                da.Fill(ds);

                DataTable dt = ds.Tables[0];

                tablesList = (from DataRow dr in dt.Rows
                              select new TablesInfo()
                              {
                                  TableCatalog = dr["TABLE_CATALOG"].ToString(),
                                  TableName = dr["TABLE_NAME"].ToString(),
                                  TableSchema = dr["TABLE_SCHEMA"].ToString(),
                                  TableType = dr["TABLE_TYPE"].ToString(),
                              }).ToList();

                    */
                con.Close();
            }
        }
        return tablesList;
    }

我创建了一个 class 也 TablesInfo 来填充数据并使用强类型对象。但是,由于找不到填充它的方法,所以使用 SelectListItem。 因为它只包含 table 的列表,所以我不希望它在每次刷新页面时都被填充。

您不能将包含 List<User>ViewBag 动态对象直接用于 DropDownList HTML 助手,您需要将其转换为 SelectList相反:

@Html.DropDownList("tableName", (SelectList)ViewBag.TableList, "Select Table")

此外,DataFiller.GetTableNames()方法调用应该returnsSelectList实例:

class DataFiller
{
    public SelectList GetTableNames()
    {
        // set select list items here
    }
}

注意:我非常喜欢使用强类型视图模型,而不是使用 ViewBagViewData 将列表传递给 HTML 助手,如下所示:

@Html.DropDownListFor(model => model.tableName, Model.TableList as SelectList, "Select Table")

相关问题:

MVC3 DropDownList + ViewBag issue

正如 Tetsuya 所说,您应该使用强类型视图模型。

您可以像这样构造您的模型:

 public class MyUserCollection
    {
        public List<MyUser> Users { get; set; }
        public SelectList TableList { get; set; }
        public int TotalRows { get; set; }

        public MyUserCollection(string search, string sort, string sortdir, int skip, int pageSize)
        {
            TableList = DataFiller.GetTableNames();

            Users = GetUsers(search, sort, sortdir, skip, pageSize, out totalRecord);
        }
    }

然后创建下拉列表:

@Html.DropDownListFor(model => model.tableName, Model.TableList as SelectList, "Select Table")

否则你需要转换你的对象:

@Html.DropDownList("tableName", (SelectList)ViewBag.TableList, "Select Table")

请使用以下代码,希望对您的查询有所帮助。

ViewBag.TableList = DataFiller.GetTableNames();

@Html.DropDownList("ID", new SelectList(ViewBag.TableList, "ID", "Name"));

其实你也可以像下面那样做:

@Html.DropDownListFor(m => m.tableName, (IEnumerable<SelectListItem>)ViewBag.TableList ,"select table")