1

看完本教程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; }
}

配方视图模型

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 值。

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

4

2 回答 2

3

您正在比较item.RecipeIdViewBag.id它不存在。ViewBag您在控制器操作中设置的成员是ViewBag.RecipeId.

但是,您根本不需要这个条件。所有配方行都已用于该配方 ID,因为您仅在Model.RecipeLines.

于 2015-10-13T15:23:40.193 回答
-1
//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>
    }
}
于 2015-10-13T15:32:17.943 回答