ASP.NET MVC View throwing CS1061 ошибка, связанная с типом объекта модели, переданного как ViewDdata в представление - PullRequest
1 голос
/ 09 августа 2010

Я работаю над статьей ASP.NET MVC по адресу http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx. (Примечание: некоторые конструкции в этом посте устарели в MVC 1 RTM, поэтому я соответствующим образом изменил код. Возможно, это мойпроблема.)

В моем LINQ to SQL .dbml (в MyDB .designer.cs) класс Category (сгенерированный компилятором) определяется следующим образом:

namespace MVC_Basics_1.Models
{
    ...
    [Table(Name="dbo.Categories")]
    public partial class Category : INotifyPropertyChanging, INotifyPropertyChanged
    {
        ...
    }

В моем классе контроллера я определяю метод действия Categories следующим образом:

public ActionResult Categories()  // /Products/Categories/ maps here
{
    List<Category> categories = northwind.GetCategories();
    return View("Categories", categories);
}

Затем я создаю Categories.aspx, который строго типизирован как "MVC_Basics_1.Models.Category", который помещает

<%@ ... Inherits="System.Web.Mvc.ViewPage<MVC_Basics_1.Models.Category>" %>

строка в верхней части файла.

Наконец, в .aspx у меня есть:

<% foreach (var category in ViewData) { %>
    <li>
        <%= Html.ActionLink(category.CategoryName, new { action="List", category=category.CategoryName }) %>
    </li>
<% } %>

Два вопроса:

Во-первых, когда я просматриваю/ Products / Categories / я получаю сообщение об ошибке:

Сообщение об ошибке компилятора: CS1061: «System.Collections.Generic.KeyValuePair» не содержит определения для «CategoryName» и не имеет расширенияметод 'CategoryName', принимающий первый аргумент типа 'System.Collections.Generic.KeyValuePair 'может быть найдено (вам не хватает директивы using или ссылки на сборку?)

, и объект данных представления категории не распознает ни одно из свойств класса Category.

Чего мне не хватает?

Во-вторых, метод действия Category () контроллера возвращает список категорий (набранный как «Список категорий») в качестве данных представления для представления, но представления представления.Вспомогательный метод ActionLink ссылается на «category.CategoryName».Это не имеет смысла для меня, так как я передаю в качестве типа экземпляр категорий (не Category).Так как метод действия контроллера возвращает List, разве это не говорит о том, что представление должно быть напечатано как Категории?

ОБНОВЛЕНИЕ:

Я понял ошибку в своем вопросеи в моем подходе к этому.Я был более сосредоточен на ошибке и сравнивал свои результаты со статьей, которую я прочитал, чем с моей настоящей целью - вроде как не видеть лес сквозь деревья.Когда я подумал о том, что на самом деле пытался выполнить - передав данные модели в представление - я остановился на синтаксической ошибке и начал думать о (а) конкретном объекте, который я хотел создать в контроллере, и (б) какойэти данные я хотел бы передать на просмотр.Когда я увидел лес сквозь деревья, ответ для меня стал очевидным.@Ufuk и @ryk помогли мне понять это.

Ответы [ 3 ]

3 голосов
/ 09 августа 2010

Вы должны строго ввести Вид в список, а не только модель.

<%@ ... Inherits="System.Web.Mvc.ViewPage<IEnumerable<MVC_Basics_1.Models.Category>>" %>

Думаю, это должно решить обе твои проблемы. Во-первых, вы не можете просматривать его с помощью foreach, потому что ваша модель не реализует IEnumerable. Вторые List<Category> экземпляры - это списки, вы должны обратиться к члену, если хотите использовать свойства класса Category.

Обновление

В вашем View тоже есть проблема. Вы отправляете список в Model, а не в ViewData. Измените ваш View следующим образом:

<% foreach (var category in Model) { %>
    <li>
        <%= Html.ActionLink(category.CategoryName, new { action="List", category=category.CategoryName }) %>
    </li>
<% } %>
1 голос
/ 20 июня 2011

Однажды у меня была эта проблема, я передавал целочисленное значение в качестве первого параметра для метода ActionLink (когда ожидаемое значение является строкой), поэтому я получил эту ошибку, которая была вызвана для типа данных параметра с ошибкой ввода.Я просто преобразовал параметр в строку, и это сработало (т.е. myModel.integerProperty.ToString ()).

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 09 августа 2010
<%@ ... Inherits="System.Web.Mvc.ViewPage<MVC_Basics_1.Models.Category>" %>

должно быть

<%@ ... Inherits="System.Web.Mvc.ViewPage<List<MVC_Basics_1.Models.Category>>" %>

Вы должны использовать 'модель' вместо ViewData.

<% foreach (var category in model) { %>
    <li>
        <%= Html.ActionLink(category.CategoryName, "List", new {category= category.CategoryName }) %>
    </li>
<% } %>

ViewData - это хеш-таблица, использующая пары ключ-значение, поэтому итерация по ViewData даст вам каждый объект в хеш-таблице, а не вашу модель, которую вы объявляете и передаете в View.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...