【问题标题】:Pass more than one model to view传递多个模型以查看
【发布时间】:2010-10-27 18:21:22
【问题描述】:
public ActionResult Index()
{ 
    var pr = db.products;
    return View(pr); 
}

首先 - 我想向视图传递更多数据 - 例如:

public ActionResult Index()
{ 
    var pr = db.products;
    var lr = db.linksforproducts(2)
    return View(pr,lr); 
}

如何读取视图中的lr 数据?

其次 - 在视图中,我有一个产品表,我想在表中添加一个包含该产品所有标签的列。如何获取每个产品的标签?

现在我创建此代码

public class catnewModel
{

    public IQueryable<category> dl { get; set;   }
    public IQueryable<product> dr { get; set;   }
}

和我的控制器

public ActionResult Index()
    {

        var pr = db.products;
        var pl = db.categories;

        catnewModel model = new catnewModel();
        model.dr = pr;
        model.dl = pl;

        return View(model);
    }

在我看来,我尝试迭代

 <% foreach (var item in Model.dr)  %>

但我收到错误

error CS1061: 'System.Collections.Generic.IEnumerable<amief.Models.catnewModel>' does not contain a definition for 'dr' and no extension method 

【问题讨论】:

  • 第二个问题我没看懂,请详细说明。
  • 我的视图显示产品列表。我想在运行时为每个产品带来数据库数据(图像、标签...),我需要使用用户控件并将产品 ID 传递给他吗?
  • 在您看来,只需使用代码块 来迭代您的产品,并将您的标记粘贴在您想要显示的位周围。

标签: asp.net-mvc-2


【解决方案1】:

我通过创建一个特定于您需要信息的视图的 ViewModel 来做到这一点。

然后在该 ViewModel 中只有属性来容纳您的其他模型。

类似这样的:

public class ViewModel
{
    public List<ProductModel> Products(){get; set;}
    public List<LinksForProductModel> LinksForProducts(){get; set;}
}


public ActionResult Index()
{ 
    var pr = db.products;
    var lr = db.linksforproducts(2)

    ViewModel model = new ViewModel();
    model.Products = pr;
    model.LinksForProducts = lr;


    return View(model); 
}

【讨论】:

  • 放置 ViewModel 类的难处在哪里?我需要把它放在模型文件夹中吗?
  • 我将模型与视图模型分开。您的模型应该代表系统中的事物、人、汽车、产品等以及业务逻辑和验证逻辑。您的视图模型是专门针对该视图的特定模型,因此我将其放在名为 ViewModels 的文件夹中。
  • 在视图中我尝试访问 model.Products 但出现错误。
  • 我觉得这门课没问题。
【解决方案2】:

创建一个包含两个属性的视图模型:

public class MyViewModel
{
    public IEnumerable<Product> Products { get; set; }
    public IEnumerable<LinkProduct> Links { get; set; }
}

在你的控制器中:

public ActionResult Index()
{ 
    var model = new MyViewModel
    {
        Products = db.products,
        Links = db.linksforproducts(2)
    };
    return View(model); 
}

【讨论】:

    【解决方案3】:

    通常 - 您为每个视图创建视图模型。

    在你的情况下,那将是:

    public class IndexModel{
      public ProductModel[] Products{get;set;}
      public LinkForProduct[] Links{get;set;}
    }
    
    public ActionResult Index(){
      var model=new IndexModel{
        Products=Map(db.products), 
        Links=Map(db.linksforproducts(2)};
      return View(model);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2013-12-05
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-30
      相关资源
      最近更新 更多