MVC将来自两个不同表的数据合并为一个视图

时间:2016-01-27 09:19:48

标签: c# asp.net-mvc

最近我一直试图进入MVC。我在微软的asp.net网站上完成了MVC教程。现在我想弄清楚如何在我正在处理的应用程序的模型类(C#)代码中应用以下数据库设计,我遇到了一些麻烦。

我想知道如何将ProductCategory添加到我的模型中:

Database design

我的模特课:

namespace myprojectname.Models
{
    public class ShoppingCartItems
    {
        public virtual int ID { get; set; }
        [Required]
        [Display(Name="Product name")]
        public virtual string ProductName { get; set; }
        //[Display(Name="Category")]
        //public virtual int CategoryName { get; set; }
        [Display(Name="Date")]
        public virtual DateTime DateAdded { get; set; }
        [Required]
        [DataType(DataType.Currency)]
        public virtual decimal ProductPrice { get; set; }
        public virtual int AmountAvailable { get; set; }
    }
}

ShoppingCartItems应该显示products表的所有条目。 据我所知,应该可以搭建所有表格,并在一个页面上显示所有带有类别的产品。

任何人都可以解释一下这样的MVC模型类(或者我是否需要向控制器类添加查询?)需要看起来像是为了在属于所显示产品的索引视图上显示类别?我是否需要创建类别为Category的对象并将其添加到我的属性中?

3 个答案:

答案 0 :(得分:0)

是的,你应该为Category创建一个类。那么你的Product类应该有一个List属性。

当您将产品列表传递给View时,他们会知道他们拥有哪些类别。

如果没有关于您正在使用的数据层技术的更多信息,我无法提供更多示例。

答案 1 :(得分:0)

您可以简单地创建ViewModel类。在项目中创建一个文件夹,在此文件夹中创建一个类。

public class ViewModel
{
    public Product Product { get; set; }
    public IEnumerable<Product> Products { get; set; }

    public Genre Category { get; set; }
    public IEnumerable<Genre> Categories{ get; set; }
}

然后在您的操作中,您可以致电ViewModel课程。

public ActionResult ExampleClass()
{
        var viewModel = new ViewModel
        {
            Products = db.Products.ToList(), //you can also call just one product here
            Categories = db.Categories .ToList() //same here
        };

        return View(viewModel);;
}

查看:

@model Injuriesp.ViewModels.ViewModel

答案 2 :(得分:0)

我是第一个来这里,我希望这会有所帮助: 例如,产品型号是:

[Table("Products")]
public class Product
{
    [Key]
    public string Id { get; set; }
    [Required]
    public string Name { get; set; }
}

类别模型:

[Table("Categories")]
public class Category
{
    [Key]
    public string Id { get; set; }
    [Required]
    public string Name { get; set; }
}

产品类别型号:

[Table("ProductCategories")]
public class ProductCategory
{
    [Key]
    [Column(Order = 0)]
    public string ProductId { get; set; }
    [Key]
    [Column(Order = 1)]
    public string CategoryId { get; set; }
    public virtual Category Category { get; set; }
}

您需要添加ViewModel:

public class ProductDetailsViewModel
{
    public virtual Product Product { get; set; }
    public virtual ICollection<ProductCategory> ProductCategories { get; set; }
}

现在控制器的“详细信息”部分示例:

// GET: Products/Details/5
    public async Task<ActionResult> Details(string id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Product product = await db.Products.FindAsync(id);
        if (product == null)
        {
            return HttpNotFound();
        }
        ProductDetailsViewModel model = new ProductDetailsViewModel()
        {
            Product = await db.Products.SingleOrDefaultAsync(x => x.Id == id),
            ProductCategories = await db.ProductCategories.Where(x => x.ProductId == id).ToListAsync()
        };
        return View(model);
    }

最后详情查看:

@model YourApplicationName.Models.ProductDetailsViewModel



<hr />
<dl class="dl-horizontal">
    <dt>
        @Html.DisplayNameFor(model => model.Product.AddedAt)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Product.AddedAt)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.Product.Name)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Product.Name)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.Product.Description)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Product.Description)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.Product.InwearhouseQuantity)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Product.InwearhouseQuantity)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.Product.InternalPrice)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Product.InternalPrice)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.Product.ExternalPrice)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Product.ExternalPrice)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.Product.Published)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Product.Published)
    </dd>

    <dt>
        @Html.DisplayNameFor(model => model.Product.Url)
    </dt>

    <dd>
        @Html.DisplayFor(model => model.Product.Url)
    </dd>
    <dt>
        @Html.DisplayNameFor(model => model.ProductCategories)
    </dt>
    <dd>
        <table class="table">
            <tr>
                <th>Category</th>
                <th>Description</th>
            </tr>
            @foreach (var item in Model.ProductCategories)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Category.Name)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Category.Description)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Category.Url)
                    </td>
                </tr>
            }
        </table>
    </dd>
</dl>