我是ASP.NET MVC技术的初学者。 在我的View页面中,我有一个WebGrid,它绑定到从Controller传递的数据。我还想用数据库中的表列表填充下拉列表。我从帮助方法中检索表List。我正在尝试将List发送到ViewBag并希望填充下拉列表;但是无法得到它。某些语法错误仅出现或无法访问List。
我的控制器类:
[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
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
用户模型不包含任何List或任何DropDownList。下拉是一个完全独立的组合框,我想用List项填充;它只包含数据库中的表名列表。
我无法获得如何使用SelectLiteItem项绑定或填充下拉列表。我google了很多,但无法得到这个场景的任何例子。我不想用我的模型添加我的列表。而且,我想只填充一次表格下拉列表。
任何人都可以帮助我并指导我如何实现目标。任何帮助都非常感谢。
由于
汤姆
更新:
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
。
因为它只包含表格列表,所以我不希望在每次刷新页面时都填充它。
答案 0 :(得分:3)
您无法将包含ViewBag
的{{1}}动态对象直接用于List<User>
HTML帮助程序,您需要将其转换为DropDownList
而不是:
SelectList
此外,@Html.DropDownList("tableName", (SelectList)ViewBag.TableList, "Select Table")
方法调用应返回DataFiller.GetTableNames()
实例:
SelectList
注意:我更喜欢使用强类型视图模型,而不是使用class DataFiller
{
public SelectList GetTableNames()
{
// set select list items here
}
}
或ViewBag
将列表传递给HTML帮助器,如下所示:
ViewData
相关问题:
答案 1 :(得分:2)
正如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")
答案 2 :(得分:2)
请使用以下代码,我希望这有助于您的查询。
ViewBag.TableList = DataFiller.GetTableNames();
@Html.DropDownList("ID", new SelectList(ViewBag.TableList, "ID", "Name"));
答案 3 :(得分:2)
你也可以像下面这样做:
@Html.DropDownListFor(m => m.tableName, (IEnumerable<SelectListItem>)ViewBag.TableList ,"select table")