asp.net MVC 3 Razor / Linq - PullRequest
       2

asp.net MVC 3 Razor / Linq

2 голосов
/ 12 июля 2011

Я получаю эту ошибку:

Элемент модели, переданный в словарь, имеет тип 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);
}

Я хочу вернуть все записи после сегодняшней даты и количества записей. Я новичок в этом, любая помощь очень ценится! Спасибо заранее, если вам нужны подробности, просто дайте мне знать. Спасибо!

Это мой взгляд

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

@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);
    }

Ответы [ 2 ]

0 голосов
/ 12 июля 2011

Ваше мнение ожидает IEnumerable<AtAClick.Models.WhatsOn>, но вы передаете коллекцию анонимных типов.Вы должны изменить свою проекцию (Select), чтобы вместо нее создавать экземпляры типа WhatsOn.

Обновление

Вам потребуется создать новый объект передачи данных.(DTO) тип для проецирования (например, WhatsOnDto), так как WhatsOn является типом сущности.См. Сущность не может быть создана в запросе LINQ to Entities для получения дополнительной информации.Измените тип модели вашего представления на IEnumerable<WhatsOnDto> или, что еще лучше, на тип MyViewModel, который содержит свойство WhatsOnDtos.

0 голосов
/ 12 июля 2011

Я думаю, что проблема заключается в несоответствии между тем, что ожидает ваш взгляд, и тем, что передает ваш контроллер.

В вашем операторе выбора вы выбираете новый анонимный тип, но ваше представление ожидает тип IEnumerable<WhatsOn>

, предполагая, что в полях задано день, а whtscount заменяет запрос даты на

    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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...