MVC 5 ViewModel не работает так, как в MVC 4

я постараюсь сразу перейти к делу. У меня была помощь в создании ViewModel здесь, на StackOverflow. Он отлично работал в MVC 4, но теперь, когда я конвертирую приложение в MVC 5, он не работает. В кодексе ничего не изменилось. У меня _navigation.cshtml, который является частичным, который отображается в моем макете.cshtml и ошибка находятся внутри циклов For В этом частичном. Этот же код отлично работает в MVC 4. Вот код:

моя ошибка находится на частичной странице во время цикла for и я получаю ошибку на Ingredient в строку:

@foreach (Ingredient ingredient in Model.Ingredients)

также в том же месте на любом другом для цикла в том же месте. Ошибка говорит:

не удалось найти тип или имя пространства имен "рецепт" (вы отсутствует директива using или ссылка на сборку?)

вот мой код:

Моделей/Ингредиента.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace XXX.Models
    {
        public class Ingredient
        {
            public int IngredientID { get; set; }
            public string IngredientNameEs { get; set; }
        }
    }

Моделей/Рецепт.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace XXX.Models
    {
        public class Recipe
        {
            public int RecipeID { get; set; }
            public string RecipeNameEs { get; set; }
        }
    }

Модели / IdentityModel.cs

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity;
    using System.Data.Entity.ModelConfiguration.Conventions;
    using System.Linq;
    using System.Web;
    using Microsoft.AspNet.Identity.EntityFramework;
    using XXX.Models;

    namespace XXX.Models
    {
        // You can add profile data for the user by adding more properties to your ApplicationUser class, 
        // http://go.microsoft.com/fwlink/?LinkID=317594 for more.
        public class ApplicationUser : IdentityUser
        {
        }

        public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
        {
            public ApplicationDbContext(): base("DefaultConnection")
            {
            }

            public DbSet<Ingredient> Ingredients { get; set; }
            public DbSet<Recipe> Recipes { get; set; }

        }
    }

ViewModels / NavigationViewModel.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using XXX.Models;

    namespace XXX.ViewModels
    {
        public class NavigationViewModel
        {
            public IEnumerable<Ingredient> Ingredients { get; set; }
            public IEnumerable<Recipe> Recipes { get; set; }
        }
    }

Контроллеры / PartialsController.cs

    using XXX.Models;
    using XXX.ViewModels;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;

    namespace XXX.Controllers
    {
        public class PartialController : Controller
        {
            private ApplicationDbContext db = new ApplicationDbContext();

             public ActionResult Navigation()
             {
             NavigationViewModel viewModel;

             viewModel = new NavigationViewModel();
             viewModel.Ingredients = db.Ingredients.Where(i => i.IsProduct != false).ToList();
             viewModel.Recipes = db.Recipes.ToList();

             return PartialView("_Navigation", viewModel);
             }
         }
    }

Частичные/_Navigation.cshtml по (звездочки указывают на ошибки возле вещество и рецепт в течение цикла)

@model XXX.ViewModels.NavigationViewModel
@using XXX.Models
//edited for brevity..
   <li class="has-dropdown">@Html.ActionLink(XXX.Views.Shared.CultureSwap.Products, "Products", "Ingredient")
        <ul class="dropdown">
            @*//From NavigationViewModel print out each Product*@
            @foreach (*Ingredient* ingredient in Model.Ingredients)
            {
                <li><a href="/Ingredient/Products/#@ingredient.IngredientNameEs">@ingredient.IngredientNameEs</a></li>
    }
        </ul>
    </li>

    <li class="divider"></li>
    <li class="has-dropdown">@Html.ActionLink(XXX.Views.Shared.CultureSwap.Recipes, "List", "Recipe")
        <ul class="dropdown">
            @foreach (*Recipe* recipe in Model.Recipes)
            {
                <li><a href="/Recipe/List/#@recipe.RecipeNameEs">@recipe.RecipeNameEs</a></li>
            }
        </ul>
    </li>

опять ошибки читать:

не удалось найти тип или имя пространства имен "ингредиент" (вы отсутствует директива using или ссылка на сборку?)

не удалось найти тип или имя пространства имен "рецепт" (вы отсутствует директива using или ссылка на сборку?)

вот скриншот ошибки в Visual Studio рядом с тем же кодом без ошибки:

enter image description here

3 ответов


ваш взгляд не знает, где Ingredient или Recipe come from, вам нужно добавить ссылку на пространство имен, в котором находятся эти типы, add @using XXX.Models в верхней части вашего просмотра

@model XXX.ViewModels.NavigationViewModel
@using XXX.Models
...
@foreach (Ingredient ingredient in Model.Ingredients)
{
    ...
}

на боковой ноте у вас, похоже, есть наполовину испеченная реализация модели представления. В NavigationViewModel вы ссылаетесь, которые, по-видимому, модели домена. Обычно рекомендуется, чтобы все, что представлено через модель представления, на самом деле было самой моделью представления. Так что в твоем случае, я представит пару новых моделей представления для представления Ingredient / Recipe то есть

public class IngredientViewModel
{
    ...
}

public class RecipeViewModel
{
    ...
}

public class NavigationViewModel
{
    public IEnumerable<IngredientViewModel> Ingredients { get; set; }
    public IEnumerable<RecipeViewModel> Recipes { get; set; }
}

они будут созданы под XXX.ViewModels что означало бы, что ваш взгляд будет выглядеть как

@using XXX.ViewModels
@model NavigationViewModel

...

есть web.config файл, расположенный в


ваше представление не знает, откуда ингредиент или рецепт, вам нужно добавить ссылку на пространство имен, в котором находятся эти типы, добавить @using XXX.Модели в верхней части вашего зрения.