相关数据未显示 asp.net c#

Related data not showing asp.net c#

阅读本教程后http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/reading-related-data-with-the-entity-framework-in-an-asp-net-mvc-application我已经创建了一些模型、控制器和视图。

食谱在视图中显示得很好,但我无法显示 RecipeLines。

配方模型

public class RecipeModel
{
    [Key]
    public int RecipeId { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public  string ImageUrl { get; set; }
    public virtual ICollection<RecipeLine> RecipeLines { get; set; }
}

食谱行

public class RecipeLine
{
    [Key]
    public int RecipeLineId { get; set; }
    public int RecipeId { get; set; }
    public double Quantity { get; set; }
    public UnitOfMeasureModel UnitOfMeasure { get; set; }
    public IngredientModel Ingredient { get; set; }
}

RecipeViewModel

public class RecipeViewModel
{
    public IEnumerable<RecipeModel> RecipeModels { get; set; }
    public IEnumerable<RecipeLine> RecipeLines { get; set; }
}

配方控制器

 public class RecipeController : Controller
    {
        private RecipeApplicationDb db = new RecipeApplicationDb();

        [HttpGet]
        public ActionResult Index(int? id)
        {
            var viewModel = new RecipeViewModel();
            viewModel.RecipeModels = db.Recipes
                //.Include(i => i.Name)
                .Include(i => i.RecipeLines);

            if (id != null)
                {
                ViewBag.RecipeId = id.Value;
                viewModel.RecipeLines = viewModel.RecipeModels.Where(i => i.RecipeId == id.Value).Single().RecipeLines;
                }

            return View(viewModel);
        }

        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            RecipeModel recipeModel = db.Recipes.Find(id);
            if (recipeModel == null)
            {
                return HttpNotFound();
            }
            return View(recipeModel);
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }

和风景

@model RecipeApplication.Models.RecipeViewModel

@{
    ViewBag.Title = "Recepten";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            Naam
        </th>
        <th>
            Omschrijving
        </th>
        <th>
            Afbeelding
        </th>
    </tr>

@foreach (var item in Model.RecipeModels) {
    string selectedRow = "";
    if(item.RecipeId == ViewBag.RecipeId)
    {
        selectedRow = "success";
    }
    <tr class="@selectedRow" valign="top">
        <td>
            @Html.DisplayFor(modelItem => item.Name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Description)
        </td>
        <td>
            @if (item.ImageUrl != null)
            {
                @Html.DisplayFor(modelItem => item.ImageUrl)
            }
        </td>
        <td>
            @Html.ActionLink("Select", "Index", new { id = item.RecipeId}) |
            @Html.ActionLink("Edit", "Edit", new { id=item.RecipeId }) |
            @Html.ActionLink("Details", "Details", new { id=item.RecipeId }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.RecipeId })
        </td>
    </tr>
}
</table>

@if (Model.RecipeLines != null)
{
    foreach (var item in Model.RecipeLines)
    {
        string selectedRow = "";
        if (item.RecipeId == ViewBag.id)
        {
            <p>@item.Quantity @item.UnitOfMeasure @item.Ingredient</p>
        }
    }
}

选择菜谱时,该行确实获得了正确的颜色,并且我在 URL 字符串中看到了一个 id 值。

如果有人可以帮助解决这个问题,那就太棒了。

您将 item.RecipeIdViewBag.id 进行比较,后者不存在。您在控制器操作中设置的 ViewBag 成员是 ViewBag.RecipeId

但是,您根本不需要这个条件。所有的食谱行都已经针对该食谱 ID,因为您专门只在 Model.RecipeLines.

中设置了那些食谱项目
//change your controller action
[HttpGet]
public ActionResult Index(int? id)
{
    if(id == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

    var model = new RecipeViewModel();
    var data  = db.RecipeModel.Include(i => i.RecipeLines)
                    .Where(x=>x.RecipeId == id)
                    .ToList();

    model.RecipeModels = data;
    return View(model);
}

//change your viewModel
public class RecipeViewModel
{
    public IEnumerable<RecipeModel> RecipeModels { get; set; }
}


//this is in the view
@if (Model.RecipeLines != null)
{
    foreach (var item in Model.RecipeModels.RecipeLines)
    {
        <p>
            @item.Quantity 
            @item.UnitOfMeasure 
            @item.Ingredient
        </p>
    }
}