繁体   English   中英

ASP.NET MVC通过ViewBag填充DropDown

[英]ASP.NET MVC Populate DropDown thru ViewBag

我是ASP.NET MVC技术的初学者。 在“查看”页面中,我有一个WebGrid,该WebGrid绑定到从Controller传递的数据。 我还想用数据库中的表列表填充一个下拉列表。 我从助手方法中检索表List。 我正在尝试将列表发送到ViewBag,并希望填充下拉列表; 但无法做到。 某些语法错误只会出现或无法访问列表。

我的控制器课程:

        [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

用户模型不包含任何列表或任何DropDownList。 下拉列表是一个完全独立的组合框,我要填充一个列表项; 它仅包含数据库中表名称的列表。

我无法获取如何使用SelectLiteItem项目绑定或填充下拉列表。 我在Google上搜索了很多,但是在这种情况下无法获得任何示例。 我不希望在模型中添加我的列表。 而且,我只想填充一次Tables列表下拉列表。

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

谢谢

汤姆

更新: 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;
    }

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

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

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

此外, DataFiller.GetTableNames()方法调用应返回SelectList实例:

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问题

正如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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM