【问题标题】:Nested ForLoop In PartialView not working using MVC 5 ViewModel部分视图中的嵌套 For 循环无法使用 MVC 5 ViewModel
【发布时间】:2014-02-16 03:44:59
【问题描述】:

我有一个模型,其中食谱具有相应的食谱线,我试图打印出这些食谱的列表,这些食谱循环通过具有该特定食谱的相应食谱 ID 的食谱线。我快到了……

这里是模型

模型/Recipe.cs

namespace XXX.Models
{
    public class Recipe
    {
        public int RecipeID { get; set; }
        public string RecipeName { get; set; }
        public string RecipeInstructions { get; set; }
        public int Serves { get; set; }
        public float PrepTime { get; set; }

        public virtual List<RecipeLine> RecipeLines { get; set; }
    }
}

模型/RecipeLine.cs

namespace XXX.Models
{
    public class RecipeLine
    {
        public int RecipeLineID { get; set; }
        public string Quantity { get; set; }
        public float MeasureAmount { get; set; }
        public int MeasurementID { get; set; }
        public string Instruction { get; set; }

        public int RecipeID { get; set; }
        public int IngredientID { get; set; }

        public virtual Measurement Measurement { get; set; }
        public virtual Recipe Recipe { get; set; }
        public virtual Ingredient Ingredient { get; set; }
    }
}

Models/Measurement.cs

namespace XXX.Models
{
    public class Measurement
    {
        public int MeasurementID { get; set; }
        public string Measurement { get; set; }

        public virtual List<RecipeLine> RecipeLines { get; set; }
    }
}

Models/Ingredient.cs

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

        public virtual List<RecipeLine> RecipeLines { get; set; }
    }
}

这是视图模型

ViewModels/RecipeLineViewModel.cs

namespace XXX.ViewModels
{
    public class RecipeLineViewModel
    {
        public IEnumerable<Recipe> AllRecipes { get; set; }
        //public IEnumerable<RecipeLine> AllRecipeLines { get; set; }

        private ApplicationDbContext db = new ApplicationDbContext();

        public void PopulateModel()
        {
            AllRecipes = db.Recipes.Include("RecipeLines")
           .Include("RecipeLines.Measurement")
           .Include("RecipeLines.Ingredient");
        }
    }
}

我的部分控制者

Controllers/Partial.cs

using XXX.ViewModels;
using XXX.Models;

namespace XXX.Controllers
{
    public class PartialsController : Controller
    {
        public ActionResult RecipeList()
        {
            RecipeLineViewModel model = new RecipeLineViewModel();
            model.PopulateModel();

            return PartialView("_RecipeList", model);
        }
    }
}

好的,现在讨论在 NESTED FOR LOOP 期间给我带来问题的 PartialView。 FIRST FOR LOOP 工作正常。这是我显然错了的嵌套循环

Partials/_RecipeList.cshtml

@model XXX.ViewModels.RecipeLineViewModel
<div class="row">
    <div class="large-6 columns">
        <h4>Recipes&nbsp;&nbsp;&nbsp;&nbsp;@if (Request.IsAuthenticated && User.IsInRole("admin"))
         { @Html.ActionLink("Create New", "Create", "Recipe") }</h4>
        <p>Our recipes are a combination of meals we have put together using our own products and meals our customers have submitted of their own creation using our products!</p>
    </div>
    <div class="large-2 columns">&nbsp;&nbsp;</div>@*Blank column*@
    <div class="large-4 columns">
        <h4>Select a Recipe</h4>
        @foreach (var recipe in Model.AllRecipes)
        {
            <a href="#@recipe.RecipeName" class="small button">@recipe.RecipeName</a>
        }
    </div>
</div>

@foreach (var recipe in Model.AllRecipes)
{
    <div class="row" id="@recipe.RecipeName"><div class="large-12 columns"><hr /></div></div>

    <div class="row">
        <div class="large-4 columns">
            @if (File.Exists(Server.MapPath("~/Images/recipes/" + recipe.RecipeImage)))
            { <img src="~/Images/recipes/@recipe.RecipeImage"> }
            else
            { <h5>No image available</h5> }
            <br /><br />
            @if (Request.IsAuthenticated && User.IsInRole("admin"))
            {
                <div class="row"><div class="large-12 columns"><strong>UPDATE RECIPE: </strong> @Html.ActionLink("Edit", "Edit", "Recipe", new { id = recipe.RecipeID }, null) | @Html.ActionLink("Details", "Details", "Recipe", new { id = recipe.RecipeID }, null) | @Html.ActionLink("Delete", "Delete", "Recipe", new { id = recipe.RecipeID }, null)</div></div>
            }
        </div>

        <div class="large-8 columns">
            <h4>@recipe.RecipeName / @recipe.RecipeName</h4>
            <div>
                Prep Time: @recipe.PrepTime Mins / Serves: @recipe.Serves People
                @if (Request.IsAuthenticated && User.IsInRole("admin"))
                { @Html.ActionLink("Edit", "Edit", "Recipe", null, null, "Serves", new { id = recipe.RecipeID }, null) }

            </div>
            <br /><strong>Ingredients:</strong><br /><br />
            @foreach (RecipeLine recipeLines in Model.RecipeLines.Where(rl => rl.RecipeID == recipe.RecipeID))
            {
                <div>
                    @if (recipeLines.Quantity != "0")
                    {
                        @recipeLines.Quantity }
                    @if (recipeLines.MeasureAmount != 0)
                    {
                        @recipeLines.MeasureAmount }
                    @if (recipeLines.Measurement.Measurement != "none")
                    {
                        @recipeLines.Measurement.Measurement }
                    @recipeLines.Ingredient.IngredientName @recipeLines.Instruction
                    @if (Request.IsAuthenticated && User.IsInRole("admin"))
                    {
                        @Html.ActionLink("Edit", "Edit", "RecipeLines", new { id = recipeLines.RecipeLineID }, null);
                    }
                    @if (Request.IsAuthenticated && User.IsInRole("admin"))
                    {
                        @Html.ActionLink("Delete", "Delete", "RecipeLines", new { id = recipeLines.RecipeLineID }, null) }
                </div>
            }
            @if (Request.IsAuthenticated && User.IsInRole("admin"))
            { @Html.ActionLink("+", "Create", "RecipeLines", new { recipeid = recipe.RecipeID }, null);
            }
            <br />

        </div>
    </div>

    <div class="row">
        <div class="large-12 columns">
            <strong>Instructions:</strong>
            @if (Request.IsAuthenticated && User.IsInRole("admin"))
            {
                @Html.ActionLink("Edit", "Edit", "Recipe", null, null, "Instructions", new { id = recipe.RecipeID }, null);
            }
            <br /><br />
            <div>@Html.Raw(recipe.RecipeInstructions.Replace("\n", "<br />"))</div><br />
        </div>
    </div>
}

如果你看的代码太多,这里有一个缩短的版本,它的意思是一样的..

缩写代码 Partials/_RecipeList.cshtml

@model XXX.ViewModels.RecipeLineViewModel
@foreach (var recipe in Model.AllRecipes)
{
@recipe.RecipeName

    @foreach (var recipeLines in Model.AllRecipes.RecipeLines.Where(rl => rl.RecipeID == recipe.RecipeID))
    {
    @recipeLines.Measurement.Measurement
    @recipeLines.Ingredient.IngredientName
    @recipeLines.Instruction
    }
}

是的,当涉及到这种类型的操作时,我完全是个菜鸟。我想更好地理解它,但我一直在努力弄清楚。任何帮助,将不胜感激。我知道我快到了。

这是当前错误:

【问题讨论】:

  • 怎么不工作了?
  • 糟糕,对不起,让我把错误告诉你。我不认为这很重要,因为我知道我的语法是错误的。
  • 我更新了。但就像我说的,问题可能只是我的语法。也许是 ViewModel。但我认为这是嵌套 for 循环中的语法。
  • 您的代码示例不一致。您的错误消息显示没有出现在您的代码示例中的代码。您的错误消息清楚地告诉您您正在引用模型上不存在的属性。然后第二个错误说该模型不存在-我怀疑您正在混合示例和错误消息。
  • 我认为 Nathan 想说的是您的错误与您的代码不匹配。仔细查看它们,您会发现您没有包含正确的行。

标签: asp.net for-loop asp.net-mvc-5 asp.net-mvc-partialview asp.net-mvc-viewmodel


【解决方案1】:

在你的代码中你有这个......

@foreach (RecipeLine recipeLines in Model.RecipeLines.Where(rl => rl.RecipeID == recipe.RecipeID))
        {
...

错误Model Contains no definition for RecipeLines 指定的违规行是这个...

Model.RecipeLines.Where(rl => rl.RecipeID == recipe.RecipeID)

你需要把它改成这个

recipe.RecipeLines.Where(rl => rl.RecipeID == recipe.RecipeID)

recipe 来自外部循环,RecipeLines 来自您的 Recipe

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-07-13
  • 2021-11-27
  • 2023-02-09
  • 1970-01-01
  • 2021-12-11
  • 2020-06-20
  • 2021-01-24
  • 2021-08-02
相关资源
最近更新 更多