【问题标题】:asp.net MVC 3 Razor/Linqasp.net MVC 3 剃刀/Linq
【发布时间】:2011-07-12 22:01:40
【问题描述】:

我收到此错误:

传入字典的模型项的类型为System.Data.Entity.Infrastructure.DbQuery``1[<>f__AnonymousType1``2[System.DateTime,System.Int32]],但此字典需要System.Collections.Generic.IEnumerable``1[AtAClick.Models.WhatsOn] 类型的模型项。

这是我的控制器;

public ViewResult Index(WhatsOn model)
{       
   DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);

   var datequery =
            db.WhatsOns.Where(c => c.start > myDate).OrderByDescending(c => c.start).GroupBy(c => c.start).Select(
                sGroup => new
                              {
                                  day = sGroup.Key,
                                  whtscount = sGroup.Count()
                              });

   return View(datequery);
}

我想返回今天日期之后的所有条目和条目数。我是新手,非常感谢任何帮助!在此先感谢,如果您需要任何 mjore 详细信息,请告诉我。谢谢!

这是我的看法

================================

@model IEnumerable<AtAClick.Models.WhatsOn>

@{ ViewBag.Title = "Index"; }

<h2>Index</h2>

<p>@Html.ActionLink("Create New", "Create")</p>
<table>
    <tr>
        <th>start</th>
        <th>end</th>
        <th>Name</th>
        <th>Desc</th>
        <th>link</th>
        <th>CalenderDisplay</th>
        <th></th>
    </tr>

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

=============================

这是我控制器中的编辑方法;

// // GET: /WhatsOn/Edit/5

    public ActionResult Edit(int id)
    {
        WhatsOn whatson = db.WhatsOns.Find(id);
        return View(whatson);
    }

    //
    // POST: /WhatsOn/Edit/5

    [HttpPost]
    public ActionResult Edit(WhatsOn whatson)
    {
        if (ModelState.IsValid)
        {
            db.Entry(whatson).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(whatson);
    }

【问题讨论】:

  • 您可以编辑您的帖子并包含您的视图的代码吗?
  • 是的,我现在将其弹出...完成。编辑已经取出表格标签。它实际上有点 magled 它,但 foreach 就在那里。

标签: linq-to-sql asp.net-mvc-3 razor


【解决方案1】:

我认为问题在于您的视图期望的内容与您的控制器传递的内容不匹配。

在您的选择语句中,您选择了一个新的匿名类型,但您的视图期待类型 IEnumerable&lt;WhatsOn&gt;

假设字段上的内容是 day 和 whtscount,然后将 datequery 替换为

    var datequery =
        db.WhatsOns.Where(c => c.start > myDate).OrderByDescending(c => c.start).GroupBy(c => c.start).Select(
            sGroup => new WhatsOn()
                          {
                              day = sGroup.Key,
                              whtscount = sGroup.Count()
                          });

更新: 该错误表明您的选择查询无法转换为等效的 sql,您可以尝试将其更改为

    var datequery =
        db.WhatsOns.Where(c => c.start > myDate).OrderByDescending(c => c.start).GroupBy(c => c.start).AsEnumerable().Select(
            sGroup => new WhatsOn
                          {
                              day = sGroup.Key,
                              whtscount = sGroup.Count()
                          });

更新:我认为问题可能是当您进入编辑的 post 方法时,WhatsOn 对象不再与最初加载它的数据库 WhatsOn 相关联,试一试在将其更改为

public ActionResult Edit(int id)
{
    WhatsOn whatson = db.WhatsOns.Find(id);
    return View(whatson);
}

[HttpPost]
public ActionResult Edit(int id, FormCollection collection)
{
    WhatsOn whatsOnmodel = db.WhatsOns.Find(id);

    if (TryUpdateModel(whatsOnmodel))
    {
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(whatsOnmodel );
}

更新:如果该方法不起作用,您可以查看您的方法是否只是在开头添加了加载,所以

[HttpPost]
public ActionResult Edit(int id, WhatsOn whatson)
{
    WhatsOn whatsOnmodel = db.WhatsOns.Find(id);

    if (ModelState.IsValid)
    {
        whatsOnmodel.day = whatson.day;
        whatsOnmodel.whtscount = whatson.whtscount;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(whatsOnmodel);
}

你可以测试一下看看会发生什么

更新: 实际上我认为你的第一种方法应该有效,但我认为它需要 Id,如果你做到了会发生什么

[HttpPost]
public ActionResult Edit(int id, WhatsOn whatson)
{
    if (ModelState.IsValid)
    {
        db.Entry(whatson).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(whatson);
}

【讨论】:

  • 感谢您的回复,这让我更进一步,但现在我遇到了这个错误......实体或复杂类型“AtAClick.Models.WhatsOn”无法在 LINQ 中构造到实体查询。我是否必须在视图中编辑 foreach 才能处理此查询?再次感谢!
  • 这无需使用 DTO 即可工作。它按日期对它们进行分组并返回计数!但是,当我尝试编辑条目时出现此错误,请随时停止帮助我,我知道这是一个接一个的错误。无论如何,存储更新、插入或删除语句影响了意外数量的行(0 )。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目...有什么建议吗?无论哪种方式,我都会将您的答案标记为正确!
  • @Dan 你介意发布你试图更新记录的控制器的 post 方法
  • 现在发布了。感谢所有这些 Manatherin!
  • 关于'whatsOnmodel.day = whatson.day;'我在“/”应用程序中收到“服务器错误”。对象引用未设置为对象的实例。'...
【解决方案2】:

您的视图需要IEnumerable&lt;AtAClick.Models.WhatsOn&gt;,但您传递的是一组匿名类型。您应该更改您的投影 (Select) 以实例化您的 WhatsOn 类型的实例。

更新

您需要创建一个新的数据传输对象 (DTO) 类型以投影到(例如 WhatsOnDto),因为 WhatsOn 是一个实体类型。请参阅The entity cannot be constructed in a LINQ to Entities query 了解更多信息。将视图的模型类型更新为IEnumerable&lt;WhatsOnDto&gt;,或者最好是包含WhatsOnDtos 属性的MyViewModel 类型。

【讨论】:

  • 谢谢,我想这也是 Manatheirn 的建议。我实施了他的解决方案,但得到了我刚刚在他的答案下方的评论中发布的错误。任何帮助表示赞赏。谢谢!
  • 我现在试试这个并报告,再次感谢,我真的很感激! 2 分钟!
  • 我将 WhatDTO 类添加到我的 WhatsOn.cs 模型中,并按照您的建议进行了更改。这行得通!但是现在当我尝试编辑/更新/插入一个条目时,我得到了以前的错误。
  • 没有代码这很难,你遇到了哪个错误?
  • 嗨,开发者,Matherin 在下面的更新答案有效,它按日期对它们进行分组并返回计数。虽然当我尝试更新条目时出现此错误(正如我所说,请随时返回您正在做的任何事情,到目前为止您已经帮了我很多忙!) .... 存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。刷新 ObjectStateManager 条目....有什么建议吗?
猜你喜欢
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2011-06-09
  • 2011-12-05
相关资源
最近更新 更多