C# 视图asp.net MVC中的多个视图模型

C# 视图asp.net MVC中的多个视图模型,c#,asp.net-mvc,C#,Asp.net Mvc,我对asp.net mvc和viewmodels是新手。我有一个显示产品的视图。在视图中,我想在一个分区中显示所有产品。 然后在另一个栏目中,我只想展示特色产品,而在另一个栏目中,我想展示排名靠前的产品。我正在尝试为每个视图模型使用不同的视图模型,因为我将在不同的页面上再次使用这些视图模型。这是做这件事的正确方法吗?如果不是,是什么。另外,我如何使用viewmodels进行此操作,只是为了练习 域模型 public class Product { public int ProductId

我对asp.net mvc和viewmodels是新手。我有一个显示产品的视图。在视图中,我想在一个分区中显示所有产品。 然后在另一个栏目中,我只想展示特色产品,而在另一个栏目中,我想展示排名靠前的产品。我正在尝试为每个视图模型使用不同的视图模型,因为我将在不同的页面上再次使用这些视图模型。这是做这件事的正确方法吗?如果不是,是什么。另外,我如何使用viewmodels进行此操作,只是为了练习

域模型

public class Product
{
    public int ProductId { get; set; }
    public string SKU { get; set; }
    public string Name { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    public Boolean FeaturedProduct { get; set; }
    public Boolean NewProduct { get; set; }
    public Boolean TopRated { get; set; }
    public Boolean BestSellers { get; set; }
}
ViewModelProductsMain(父级)

视图模型(儿童)

控制器

public ActionResult Index()
{
    //How do I, instantiate and populate the model
    var model = new ViewModelProductsMain ();
    return View(model);
}
看法

@model IEnumerable

首先,您应该将ViewModelProductsMain更改为:

public class ViewModelProductsMain
    {
        public List<ViewModelProducts> Products { get; set; }

        public List<ViewModelTopRated> TopRated { get; set; }

        public List<ViewModelFeatured> Featured { get; set; }
    }
公共类ViewModelProductsMain
{
公共列表产品{get;set;}
公共列表顶级{get;set;}
公共列表{get;set;}
}
要在视图中显示产品,请编写以下代码:

@model  WebApplication1.Models.ViewModelProductsMain

@{
    ViewBag.Title = "Index";
}

<div id="AllProducts">
    @foreach (var item in Model.Products.ToList())
    {
        @item.Name
        <hr/>
    }
</div>

<div id="TopRated">
    @foreach (var item in Model.TopRated.ToList())
    {
        @item.Name
        <hr />
    }
</div>

    <div id="Featured">
        @foreach (var item in Model.TopRated.ToList())
        {
            @item.Name
            <hr />
        }
    </div>
@model WebApplication1.Models.ViewModelProductsMain
@{
ViewBag.Title=“Index”;
}
@foreach(Model.Products.ToList()中的var项)
{
@项目名称

} @foreach(Model.tograted.ToList()中的var项) { @项目名称
} @foreach(Model.tograted.ToList()中的var项) { @项目名称
}
我在您的所有模型中都看到public int ProductId{get;set;}。似乎您的数据中有一些类似思考的外键,因此您可以使视图模型比我们在ViewModelProductsMain中看到的更好

因此:

}

不要忘记为您的ViewModelProductsMain编写构造函数
如果你不做构造函数,它会带来
空引用错误

没有兄弟你所有的模型都包含相同的属性一个单一的模型可以让这个工作名为
ProductsViewModel
的视图模型,然后你的
ViewModelProductsMain
但是我怀疑你真的想要
公共IEnumerable产品{get;set;}
由于它是一个集合(可能也是特色产品?),除非您在顶级和特色产品中需要不同的属性,否则无需定义其他模型。您也可以使用局部视图在单个页面中呈现不同的部分。我认为这是有意义的。每个viewmodel仍然是它自己的类-正确吗?我如何编写构造函数,这是我仍然存在的问题with@dince在这种情况下,每个视图模型都是特定类的列表…在谷歌上,只需简单搜索一下构造函数就可以帮到你了。。
@model IEnumerable<myProject.ViewModels.ViewModelProductsMain >
public class ViewModelProductsMain
    {
        public List<ViewModelProducts> Products { get; set; }

        public List<ViewModelTopRated> TopRated { get; set; }

        public List<ViewModelFeatured> Featured { get; set; }
    }
@model  WebApplication1.Models.ViewModelProductsMain

@{
    ViewBag.Title = "Index";
}

<div id="AllProducts">
    @foreach (var item in Model.Products.ToList())
    {
        @item.Name
        <hr/>
    }
</div>

<div id="TopRated">
    @foreach (var item in Model.TopRated.ToList())
    {
        @item.Name
        <hr />
    }
</div>

    <div id="Featured">
        @foreach (var item in Model.TopRated.ToList())
        {
            @item.Name
            <hr />
        }
    </div>
    public class Product
{
    public int ProductId { get; set; }
    public string SKU { get; set; }
    public string Name { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

public class ViewModelProducts {
    public virtual List<Product> Products { get; set; }
}
public class ViewModelProductsMain
{

    public ViewModelProductsMain()
    {
        this.Products = new List<ViewModelProducts>();
        this.TopRated = new List<ViewModelTopRated>();
        this.Featured = new List<ViewModelFeatured>();
    }
    public List<ViewModelProducts> Products { get; set; }

    public List<ViewModelTopRated> TopRated { get; set; }

    public List<ViewModelFeatured> Featured { get; set; }