在MVC5

时间:2017-05-20 16:55:28

标签: c# asp.net asp.net-mvc-5

这是我第一次发帖,我是编码和MVC的初学者。

我正在尝试创建一个过滤系统来过滤用户的帖子。我的逻辑是允许用户按用户名和类别名称搜索关键字。用户可以使用关键字和/或用户名和/或类别名称。关键字是一个简单的TextBoxFor,用户名和类别是DropDownLists。 当我只使用关键字TextBoxFor运行代码并且只有一个DropDownList时,一切正常,但是当我使用其他DropDownList时,我会收到此错误。

  

具有键'UserID'的ViewData项的类型为'System.String',但必须是'IEnumerable'类型。

我做了一些研究,我得出的结论是UserID DropDownList给出了一个空值。我唯一能想到的可能是给UserID一个默认值,但是我无法做到这一点。有没有更好的方法来做它而不是给它一个默认值?如果不是,我该怎么办呢?

谢谢, bobdbuider

我的ViewModel:

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 个答案:

答案 0 :(得分:1)

您不应在ViewBag和您的模型中使用相同的属性名称。您的模型中的UserID属性类型为stringUserID中的SelectList类型为ViewBag。您的视图使用的是模型中string类型的视图但DropDownList需要IEnumerable,因此您收到此错误:

  

具有键'UserID'的ViewData项的类型为'System.String',但必须是'IEnumerable'类型。

您应该尝试不使用ViewBag,而是专门为您的视图创建一个模型,其中包含您的视图所需的所有内容,然后在您的视图中使用它。有关详细信息,请参阅this答案。