【问题标题】:Multiple ViewModels in View asp.net MVC查看 asp.net MVC 中的多个 ViewModel
【发布时间】:2017-02-15 19:23:30
【问题描述】:

我是 asp.net mvc 的新手,视图模型对我来说也是新手。我有一个显示产品的视图。在视图中,我想在一个 div 中显示所有产品。 然后在另一个 div 中,我只想显示 featuresProducts,在另一个 div 中显示 Toprated。我正在尝试为每个视图模型使用不同的视图模型,因为我将在不同的页面上再次使用它们。这是做这件事的正确方法吗?如果不是,那是什么。另外,我怎样才能使用视图模型来完成这个练习。

领域模型

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 class ViewModelProductsMain 
{
    public ViewModelProducts Products{ get; set; }
    public ViewModelTopRated TopRated{ get; set; }
    public ViewModelFeatured Featured{ get; set; }
}

ViewModels(子)

public class  ViewModelProducts (Child)
//all products
{
    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 ViewModelTopRated (Child)
//all products with TopRated true
{
    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 ViewModelFeatured (Child)
//all products with Featured true
{
    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 ActionResult Index()
{
    //How do I, instantiate and populate the model
    var model = new ViewModelProductsMain ();
    return View(model);
}

查看

@model IEnumerable<myProject.ViewModels.ViewModelProductsMain >

【问题讨论】:

  • 没有兄弟你所有的模型都包含相同的属性
  • 一个模型就能完成这项工作
  • 一个视图模型名为ProductsViewModel,然后是你的ViewModelProductsMain,但我怀疑你真的想要public IEnumerable&lt;ProductsViewModel&gt; Products { get; set; },因为它是一个集合(也许Featured 也是?)
  • 除非您需要 Toprated 和特色产​​品中的不同属性,否则无需定义其他模型。
  • 您也可以使用局部视图在单个页面中呈现不同的部分

标签: c# asp.net-mvc


【解决方案1】:

首先您应该将 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>

【讨论】:

    【解决方案2】:

    我看到 public int ProductId { get;放; } 在你的所有模型中。似乎您的数据中有一些类似于外键的想法,因此您可以使您的视图模型比我们在 ViewModelProductsMain 中看到的更好。

    所以:

        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; }
    }
    

    做你在上面看到的ViewModelFeatured和ViewModelTopRated到

    然后:

    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; }
    

    }

    不要忘记为您的 ViewModelProductsMain 编写构造函数 如果你不做构造函数..它会带来null reference error

    【讨论】:

    • 我认为这是有道理的。每个视图模型仍然是它自己的类 - 对吗?以及如何编写我仍然遇到问题的构造函数
    • @dince 在这种情况下,每个视图模型都是特定类的列表......只需简单搜索一下构造函数就可以帮助你,在谷歌上......
    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2011-07-07
    • 2010-11-11
    • 2012-08-09
    • 1970-01-01
    相关资源
    最近更新 更多