【问题标题】:MVC Multiple Models in One View一个视图中的 MVC 多个模型
【发布时间】:2015-09-04 16:02:10
【问题描述】:

我想在一个视图中访问多个模型。我有 DAL 文件夹和 DbContext。

class CvContext : DbContext
{
   public CvContext() : base("CvContext")
   {
   }

   public DbSet<LinkModel> Links { get; set; }
   public DbSet<AboutModel> Abouts { get; set; }
   public DbSet<PortfolioModel> Portfolios { get; set; }
   public DbSet<SkillModel> Skills { get; set; }

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
   }
}

还有 HomeController

public class HomeController : Controller
{
   private CvContext db = new CvContext();

   public ActionResult Index()
   {
      return View(db.Links.ToList());
   }
}

索引.cshtml

@model IEnumerable<MvcCv.Models.LinkModel>

<ul>
   @foreach (var item in Model)
   {
      <li>
         <a href="@Html.DisplayFor(modelItem => item.LinkUrl)">
                            @Html.DisplayFor(modelItem => item.LinkName)
            <span class="icon"></span>
            <span class="menu-icon">
               <img src="@Url.Content(item.LinkImage)" alt="" />
            </span>
         </a>
      </li>
   }
</ul>

如何访问所有模型?我将 foreach 用于模型中的项目,如链接。谢谢。

【问题讨论】:

  • 还有@Html.DisplayFor helper 是这个例子的好选择?
  • 创建一个封装其他模型的 ViewModel...
  • 喜欢 CvContext?但是在模型内部不是 DAL 对吗?
  • 是的,不要传递你的 dal,创建一个有 4 个列表的类。从您的 DAL 中填充这些列表(在您的控制器操作方法中执行此操作)并将这个新类传递给您的视图......这是视图模型的概念......它是一个模型,但它包含所有和唯一的信息特定视图需要...
  • 谢谢我会试试这个

标签: c# asp.net asp.net-mvc entity-framework razor


【解决方案1】:
//suppose you have two Models

public class student
{
 public int Id
 public string Name{get;set;}
}

public class class
{
 public int Id
 public string Name{get;set;}
}

// Now combine these two class Model in single Model for example:

public class Mixmodel
{
 public Student student {get;set;}
 public Class class {get;set;}
}

//here is the Home controller of the Index view

@model projectName.MixModel

@foreach(var item in Model.class)
{
@html.displayfor(item.class.Name)
}

@foreach(var item in Model.student)
{
@html.displayfor(item.student.Name)
}

【讨论】:

    【解决方案2】:

    您应该按如下方式创建视图模型:

    public class FooViewModel
    {
       public IEnumerable<LinkModel> Links { get; set; }
       public IEnumerable<AboutModel> Abouts { get; set; }
       public IEnumerable<PortfolioModel> Portfolios { get; set; }
       public IEnumerable<SkillModel> Skills { get; set; }
    }
    

    然后从您的控制器根据您的要求填充它们,例如:

       public ActionResult Index()
       {
          var model = new FooViewModel();
          model.Links = db.Links.ToList();
          model.Abouts = db.Abouts.ToList();
          model.Portfolios = db.Portfolios.ToList();
          model.Skills = db.Skills.ToList();
          return View(model);
       }
    

    然后将视图中的模型更改为FooViewModel,您的所有属性都将在其中可用。

    @model FooViewModel
    
    <ul>
       @foreach (var item in Model.Links)
       {
          <li>
               @item
          </li>
       }
    </ul>
    
    <ul>
       @foreach (var item in Model.Links)
       {
          <li>
               @item
          </li>
       }
    </ul>
    
    // ....etc, obviously change the outputs as needed.
    

    【讨论】:

    • 对于每个模型组合,我们必须根据此解决方案创建 ViewModel,但这是一个好的选择吗?动态模型呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2014-06-25
    相关资源
    最近更新 更多