【问题标题】:The model item passed into the dictionary is of type 'System.Linq.GroupedEnumerable`3 but this requires 'System.Collections.Generic.IEnumerable`1传入字典的模型项的类型为“System.Linq.GroupedEnumerable”3,但这需要“System.Collections.Generic.IEnumerable”1
【发布时间】:2017-07-26 00:12:42
【问题描述】:

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>

【问题讨论】:

    标签: c# linq generics


    【解决方案1】:

    问题源于您如何使用此代码返回视图页面:

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

    GroupBy LINQ 方法生成GroupedEnumerable 作为其结果(不是IEnumerable),并且由于您的模型期望IEnumerable 集合由@model 指令给出,因此没有从GroupedEnumerable 到@ 的直接转换987654328@ 除非使用返回IEnumerable 的方法,即ToList

    尝试在ToList 之前使用GroupBy,如下所示,以便您的操作方法返回实现IEnumerableList&lt;Question&gt;

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

    注意:如果您不确定将GroupBy 直接放在Include 之后,请在开始分组之前使用AsEnumerable 将连接查询转换为集合。

    【讨论】:

    • 非常感谢。但我想显示每个步骤的问题列表。
    • 你能描述一下你想在这里展示的“每一步”吗?我认为您需要按照用户使用OrderBy 或类似的方式采取的步骤来划分问题。
    • 我有这个:第 1 步 |问题 1 第 1 步 |问题 2 第 1 步 |问题 3 第 2 步 |问题 4 第 2 步 |问题 5 第 2 步 |问题 6
    • 我想成为这样:步骤 1:问题 1 问题 2 问题 3 步骤 2:问题 4 问题 5 问题 6
    猜你喜欢
    • 2013-10-17
    • 2022-01-16
    • 2015-09-19
    • 2012-06-25
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    相关资源
    最近更新 更多