2017-05-20 110 views
0

這是我第一次發佈,我是編碼和MVC的初學者。在MVC5中設置默認的DropDownList值

我正在嘗試創建一個過濾系統來過濾用戶的帖子。我的邏輯是允許用戶通過用戶名和類別名搜索關鍵字。用戶可以使用關鍵字和/或用戶名和/或類別名稱。關鍵字是一個簡單的TextBoxFor,用戶名和類別是DropDownLists。 當我運行的代碼只有關鍵字TextBoxFor和只有一個DropDownList的一切工作正常,但是當我使用其他DropDownList我會得到這個錯誤。

The ViewData item that has the key 'UserID' is of type 'System.String' but must be of type 'IEnumerable'.

我已經做了一些研究,並得出了UserID DropDownList給出空值的結論。我能想到的唯一可能是給UserID一個默認值,但我無法設法做到這一點。有沒有更好的方式來做到這一點,而不是給它一個默認值?如果不是,我該如何設法做到這一點?

感謝, bobdbuider

我的視圖模型:

public class DTOSearchModel 
    { 

     #region Properties 
     public string Keyword { get; set; } 

     [Display(Name = "Username")] 
     public string UserID { get; set; } 

     [Display(Name = "Category Name")] 
     public int CategoryID { get; set; } 

     public List<Models.PostTable> PostResults { get; set; } 
     #endregion 

     public DTOSearchModel() 
     { 

      Keyword = ""; 
      UserID = "Select a Username"; 
      CategoryID = 0; 

      PostResults = new List<Models.PostTable>(); 

     } 

    } 
} 

我的控制器:

//POST Search 
     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Index(DTOSearchModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       var postTables = db.PostTables.Include(p => p.AspNetUser).Include(p => p.CategoryTable).Include(p => p.StatusTable); 
       var posts = postTables.ToList(); 

       //CategoryID 
       if (model.CategoryID !=0) 
        { 
        ViewBag.CategoryID = new SelectList(db.CategoryTables, "CategoryID", "CategoryName"); 
        posts = posts.Where(k => k.CategoryID.Equals(model.CategoryID)).ToList(); 
       } 

       //UserID 


        ViewBag.UserID = new SelectList(db.AspNetUsers, "Id", "Email" ,"Select"); 
        posts = posts.Where(k => k.UserID.Equals(model.UserID)).ToList(); 



       //Keyword 
       if (!String.IsNullOrEmpty(model.Keyword)) 
       { 
        posts = posts.Where(k => k.Title.ToLower().Contains(model.Keyword.ToLower()) || k.Body.ToLower().Contains(model.Keyword.ToLower())).ToList(); 

       } 

       model.PostResults = posts; 

      } 

      return View(model); 

     } 
    } 
} 

筆者認爲:

<div class="col-md-3"> 
        @Html.LabelFor(model => model.Keyword) 
        @Html.TextBoxFor(model => model.Keyword, htmlAttributes: new { @class = "form-control" }) 
       </div> 


       <div class="col-md-4"> 
        @Html.LabelFor(model => model.UserID) 
        @Html.DropDownList("UserID", null, htmlAttributes: new { @class = "form-control" }) 
       </div> 


       <div class="col-md-4"> 
        @Html.LabelFor(model => model.CategoryID) 
        @Html.DropDownList("CategoryID" , null, "Select a Category Name", htmlAttributes: new { @class = "form-control" }) 
       </div> 

回答

1

您不應該在ViewBag和您的模型中使用相同的屬性名稱。您的模型中有一個UserID類型的屬性string,並且您在ViewBag中也有UserID類型SelectList。您的觀點是利用模型中的一個是string類型,但DropDownList需要IEnumerable使您得到這個錯誤:

The ViewData item that has the key 'UserID' is of type 'System.String' but must be of type 'IEnumerable'.

你應該嘗試不使用ViewBag而是專門建立一個模型,視圖,其擁有您的觀點所需的一切,然後在您的視野中使用它。有關更多詳細信息,請參閱this答案。

+0

感謝您的快速和詳細的答案。 我已將我的視圖模型中的用戶標識更改爲用戶名,因此它們會有所不同。我也嘗試在我的視圖模型中更改CategoryID,但是它給了我一個錯誤,所以我將它保存爲CategoryID。現在的問題是,我總是得到我有0個帖子與用戶名和/或類別相匹配。 我也測試過用戶篩選器,它不工作,所以問題是與我對Viewmodel所做的更改。 – bobdbuilder

+0

您是否看到我提供給您的鏈接中的代碼?有一個演示如何創建下拉菜單。請仔細研究該代碼,這將有助於您解決您遇到的問題。 – CodingYoshi

+0

是的,我看了小提琴。我只是問這個問題,因爲我被告知不是。讓自己給出這些值而不讓ViewBag從數據庫中獲取它們不是不好的做法嗎? 例如:如果我想添加一個類別或用戶名,我需要在newSelectListItem中自己添加條目。 – bobdbuilder