传递到字典中的模型项是'System.Linq.GroupedEnumerable`3类型,但这需要'System.Collections.Generic.IEnumerable`1

时间:2017-07-26 00:12:42

标签: c# linq generics

I get the following error when trying to run my application:

  

传递到字典中的模型项的类型为“System.Linq.GroupedEnumerable'3 [WebApplication1.Question,System.Int32,WebApplication1.Question]”,但此字典需要类型为“System.Collections”的模型项。 Generic.IEnumerable`1 [WebApplication1.Question]”。

这是堆栈跟踪:

[InvalidOperationException: The model item passed into the dictionary is of type 'System.Linq.GroupedEnumerable`3[WebApplication1.Question,System.Int32,WebApplication1.Question]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[WebApplication1.Question]'.]
   System.Web.Mvc.ViewDataDictionary`1.SetModel(Object value) +175
   System.Web.Mvc.ViewDataDictionary..ctor(ViewDataDictionary dictionary) +107
   System.Web.Mvc.WebViewPage`1.SetViewData(ViewDataDictionary viewData) +49
   System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +99
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +107
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +291
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +56
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +420
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +52
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +173
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9765901
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

和我的问题控制器:

    // GET: Questions
    public ActionResult Index()
    {
        var questions = db.Questions.Include(q => q.Step);
        return View(questions.ToList().GroupBy(x=>x.idStep));
    }

    // GET: Questions/Details/5
    public ActionResult Details(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Question question = db.Questions.Find(id);
        if (question == null)
        {
            return HttpNotFound();
        }
        return View(question);
    }

    // GET: Questions/Create
    public ActionResult Create()
    {
        ViewBag.idStep = new SelectList(db.Steps, "idStep", "nameStep");
        return View();
    }

    // POST: Questions/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "idQuestion,idStep,Question1")] Question question)
    {
        if (ModelState.IsValid)
        {
            db.Questions.Add(question);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.idStep = new SelectList(db.Steps, "idStep", "nameStep", question.idStep);
        return View(question);
    }

    // GET: Questions/Edit/5
    public ActionResult Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Question question = db.Questions.Find(id);
        if (question == null)
        {
            return HttpNotFound();
        }
        ViewBag.idStep = new SelectList(db.Steps, "idStep", "nameStep", question.idStep);
        return View(question);
    }

    // POST: Questions/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "idQuestion,idStep,Question1")] Question question)
    {
        if (ModelState.IsValid)
        {
            db.Entry(question).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        ViewBag.idStep = new SelectList(db.Steps, "idStep", "nameStep", question.idStep);
        return View(question);
    }

    // GET: Questions/Delete/5
    public ActionResult Delete(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Question question = db.Questions.Find(id);
        if (question == null)
        {
            return HttpNotFound();
        }
        return View(question);
    }

    // POST: Questions/Delete/5
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(int id)
    {
        Question question = db.Questions.Find(id);
        db.Questions.Remove(question);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
            db.Dispose();
        }
        base.Dispose(disposing);
    }
}
}

和我的观点:

@model IEnumerable<WebApplication1.Question>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>

        </th>
        <th>
            @Html.DisplayNameFor(model => model.Step.nameStep)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Question1)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id = item.idQuestion }) |
            @Html.ActionLink("Details", "Details", new { id = item.idQuestion }) |
            @Html.ActionLink("Delete", "Delete", new { id = item.idQuestion })
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Step.nameStep)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Question1)
        </td>

    </tr>
}

</table>

1 个答案:

答案 0 :(得分:1)

问题源于您使用以下代码返回视图页面的方式:

return View(questions.ToList().GroupBy(x => x.idStep));

GroupBy LINQ方法生成GroupedEnumerable作为结果(而不是IEnumerable),因为您的模型需要IEnumerable指令给出的@model集合,除非使用返回GroupedEnumerable的方法,即IEnumerable,否则无法从IEnumerable直接转换为ToList

尝试在GroupBy之前使用ToList,如下所示,以便您的操作方法返回实现List<Question>的{​​{1}}:

IEnumerable

注意:如果您不确定在public ActionResult Index() { var questions = db.Questions.Include(q => q.Step).GroupBy(x => x.idStep).ToList(); return View(questions); } 之后直接放置GroupBy,请在开始分组之前使用Include将联接查询转换为集合。