使用模型类中的多个模型生成Razor视图

时间:2016-01-03 10:50:50

标签: asp.net-mvc asp.net-mvc-4 razor

所以基本上我的所有配方都有一个模型,我想创建一个视图,如果当前登录的用户可以编辑配方,则显示所有配方的列表。我做了一个演示模型来做到这一点。但是,当我单击控制器中的“添加视图”并使用此演示模型生成新视图时,视图仅显示“配方”的布尔值字段。如何使用bool和'recipe'的所有字段生成视图。

模型'食谱':

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

namespace ReceptenApp.Models
{
public class Recept
{

    public int Id { get; set; }
    public int Category { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public string Cook { get; set; }
}
}

演示模型:

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

namespace ReceptenApp.Models.PresentationModels
{
public class PMReceptListItem
{
    public PMReceptListItem()
    {
        recept = new ReceptWithCats();
    }
    public ReceptWithCats recept { get; set; }
    public bool ShowEdit { get; set; }
}
}

生成后查看:

@model IEnumerable<ReceptenApp.Models.PresentationModels.PMReceptListItem>

@{
ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
   <tr>
       <th>
           @Html.DisplayNameFor(model => model.ShowEdit)
       </th>
       <th></th>
   </tr>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.ShowEdit)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
        @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
    </td>
</tr>
}
</table>

1 个答案:

答案 0 :(得分:0)

由于您的视图列出了所有Recept,所以让我们更新您的演示模型(视图模型)以反映这一点。我们还将创建一个新的视图模型( ReceptViewModel )来表示Recept实体。我们将在ReceptList中添加ReceptListViewModel我们新的ReceptViewModel列表,以便我们可以将Recept列表传递给视图。

public class ReceptViewModel
{
   public int Id {set;get;}
   public string Title {set;get;}
   public string Description {set;get;}
   public string Cook {set;get;}
}
public class ReceptListViewModel
{
    public PMReceptListItem()
    {
        ReceptList = new List<ReceptViewModel>();
    }
    public List<ReceptViewModel>  ReceptList { get; set; }
    public bool ShowEdit { get; set; }
}

并在您的GET操作中,从您的数据库中读取数据并加载到我们ReceptListViewModel的对象

public ActionResult Index()
{
  var vm= new ReceptListViewModel();
  vm.ReceptList = db.Recepts.Select(x=>new ReceptViewModel { 
                                           Id=s.Id, 
                                           Title=x.Title,
                                           Description=x.Description,
                                           Cook=x.Cook }).ToList();
  vm.ShowEdit = true ; //Set this value based on your condition
  return View(vm);
}

并在您的GET视图中

@model List<ReceptListViewModel>
<h2>List of Recepts</h2>
<table>
@foreach(var r in Model.ReceptList)
{
 <tr>
    <td>@r.Title</td>
    <td>@r.Description</td>
    <td>@r.Cook</td>
    @if(Model.ShowEdit)
    {
     <td>@Html.ActionLink("Edit","Edit",new { id=r.Id})</td>
     <td>@Html.ActionLink("Delete","Delete",new { id=r.Id})</td>
    }
 </tr>
}
</table>