2017-07-07 77 views
-1

我是ASP.NET MVC技術的初學者。 在我的View頁面中,我有一個WebGrid綁定到從Controller傳遞的數據。我還想用數據庫中的表列表填充下拉列表。我從輔助方法中檢索表List。我試圖將列表發送到ViewBag,並希望填充下拉列表;但不能得到它。某些語法錯誤只會到來,或者List無法訪問。ASP.NET MVC通過ViewBag填充DropDown

我的控制器類:

 [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 

用戶模型不包含任何名單,也沒有任何的DropDownList。下拉菜單是一個完全獨立的組合框,我想填寫一個List項目;它只包含數據庫中的表名列表。

我無法得到如何使用SelectLiteItem項目綁定或填充下拉列表。我搜索了很多,但無法用這種方案得到任何例子。我不想用我的模型添加我的列表。而且,我只想填充一次表格下拉列表。

任何人都可以請幫助我,並指導我如何實現目標。任何幫助,高度讚賞。

感謝

湯姆

UPDATE: 的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。 由於它只包含表格列表,因此我不希望它在每次頁面刷新時都被填充。

回答

2

至於哲也說,你應該使用強類型的視圖模型。

您可以構建模型是這樣的:

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

其他明智的,你需要投你的對象:

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

謝謝。我將你的解決方案實施爲一個獨立的類,收集所有數據並作爲模型使用。非常感謝。 – Tvd

+1

由於問題被降級,我無法將您的解決方案設置爲答案。 – Tvd

3

不能使用含有List<User>直接向DropDownList HTML輔助ViewBag動態對象,你需要把它扔在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 issue

+0

感謝。我有點困惑 - 你們都推薦使用強類型視圖模型而不是ViewBag。我的要求是隻有DB的表名列表。所以我通過靜態類方法來檢索。使用模型方法,每次調用/刷新頁面時,都不會檢索表的列表嗎?如果是這樣,那將是不必要的。所以我想到了這個選擇。 DataFilter返回List GetTableNames()。我已經爲表格數據創建了一個類,但是無法通過它填充。在我的問題中添加了方法。謝謝 – Tvd

+0

謝謝@Tetsuya。正如你所建議的,我選擇了強類型視圖模型方法。實際上,我只是在View中綁定了@ Html.DropDownListFor(model => model.TableName,Model.TableList,「Select Table」,new {class =「form-control」})代碼。 Model.TableList是SelectList的,它們也不需要對它進行類型轉換。正如我認爲我對模型有點困惑,而且正如亞歷山大所展示的模型一樣,我選擇他的解決方案作爲答案。非常感謝。我非常感謝。 –

2

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); 
     } 
    } 

下來然後創建你降使用下面的代碼,我希望這將有助於您的查詢。

ViewBag.TableList = DataFiller.GetTableNames(); 

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

感謝您的回覆。 –

+1

沒問題@TruptiDalia –

2

實際上,你可以不喜歡它下面太:

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

謝謝。你的解決方案也有效;但我選擇使用它作爲強類型視圖模型。 –

+1

我想這可以替代那些遇到類似問題的人..很高興你也解決了你的問題。 =) –