這是我第一次發佈,我是編碼和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>
感謝您的快速和詳細的答案。 我已將我的視圖模型中的用戶標識更改爲用戶名,因此它們會有所不同。我也嘗試在我的視圖模型中更改CategoryID,但是它給了我一個錯誤,所以我將它保存爲CategoryID。現在的問題是,我總是得到我有0個帖子與用戶名和/或類別相匹配。 我也測試過用戶篩選器,它不工作,所以問題是與我對Viewmodel所做的更改。 – bobdbuilder
您是否看到我提供給您的鏈接中的代碼?有一個演示如何創建下拉菜單。請仔細研究該代碼,這將有助於您解決您遇到的問題。 – CodingYoshi
是的,我看了小提琴。我只是問這個問題,因爲我被告知不是。讓自己給出這些值而不讓ViewBag從數據庫中獲取它們不是不好的做法嗎? 例如:如果我想添加一個類別或用戶名,我需要在newSelectListItem中自己添加條目。 – bobdbuilder