在单个视图中使用多个模型ASP.NET,MVC

时间:2017-01-01 10:08:04

标签: asp.net-mvc

我正在开发像OLX一样销售的二手商品,我有两个型号

  

1:Product_model

     

2:Customer_model

所以我想在一个视图中使用产品描述和客户信息。 机型:

 [Table("Product")]
    public class ProductModel
    {
        [Key]
        public string ProductId { get; set; }
        public string ProductName { get; set; }
        public decimal ProductPrice { get; set; }
        public string ProductDescription { get; set; }
        public string ProductCategory { get; set; }
        public string ProductAddress { get; set; }
        public string ProductImage1 { get; set; }
        public string ProductImage2 { get; set; }
        public string ProductImage3 { get; set; }
        public string CustomerId { get; set; }
       // public DateTime ProductSubTime { get; set; }
    }

    [Table("Customer")]
    public class CustomerModel
    {
        [Key]
        [Required(ErrorMessage = "Please provide Customer ID", 
        public string CustomerFullName { get; set; }
        public int CustomerContact { get; set; }
        public string CustomerEmail { get; set; }
        public string CustomerGender { get; set; }
        public string CustomerAddress { get; set; }
    }

我的控制器:

public ActionResult Index()
    {
        return View(cm.Products.ToList());
    }

我的观点:

@model IEnumerable<WebApplication11.Models.ProductModel>
@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/MyTemplate.cshtml";
}

 <div class="col-md-4"style="border: 2px solid yellow" >
                <div class="single-product-widget" style="border: 2px solid black">
                    <h2 class="product-wid-title">Recently Viewed</h2>
                    <a href="#" class="wid-view-more">View All</a>
                    @{ int i = 0;}
                    @foreach (var item in Model)
                    {
                           <div class="single-wid-product" style="border: 2px dashed black">
                           <a href="single-product.html"><img src="~/images/@item.ProductImage1" alt="No Photo" class="product-thumb"></a>
                           <h2>@Html.DisplayFor(model => item.ProductName)</h2>
                           </div>
                    }
             <div>
</div>

为了理解目的,我删除了部分视图。 请指导我在特定视图中访问这两个模型。 我也尝试了一些方法,但无法得到它。 提前致谢...

2 个答案:

答案 0 :(得分:1)

在特定视图中有几种选项可以访问多个模型。我假设您只想在页面角落或某些地方显示一些客户信息。您的布局视图可能需要包含此客户信息(但无论如何都无关紧要)。

  1. 从我的观点来看,最优选的选项是使用子操作
  2. 创建CustomerController

    public class CustomerController : Controller {
        [ChildActionOnly]
        public ViewResult CustomerInfo() {
            CustomerModel customer = ...
            return PartialView("_CustomerPartial", customer);
        }
    }
    

    .chstml视图将显示@Html.Action("CustomerInfo", "Customer"),您希望显示客户信息。

    这样您将拥有单独的CustomerModel创建逻辑。

    1. 另一种选择是使用ViewDataViewBag来存储二级模型信息,例如客户信息。
    2. 控制器代码:

      public ActionResult Index()
      {
          var products = cm.Products.ToList();
          ViewBag.Customer = ... // get customer
          return View(products);
      }
      

      查看代码:

      @model IEnumerable<WebApplication11.Models.ProductModel>
      @{
          ViewBag.Title = "Index";
          Layout = "~/Views/Shared/MyTemplate.cshtml";
          var customer = (CustomerModel)ViewBag.Customer;
      }
      
      @* display customer info *@
      @* either { *@
          <div>Welcome @customer.CustomerFullName. You email is @customer.CustomerEmail</div>   
      @* } or { *@
          @Html.Partial("_CustomerPartial", customer)
      @* } *@
      
      @foreach(var product in Model) {
          @* display product info *@
      }
      
      1. 可以使用强类型模型更改上一个选项。它也可以称为视图模型 - 通常是一个仅存储视图必需信息的类。在您的情况下,这些是一些客户和产品信息。
      2. 视图模型:

        public class ProductListViewModel {
            public CustomerModel Customer { get; set; }
            public IEnumerable<ProductModel> Products { get; set; }
        }
        

答案 1 :(得分:0)

您可以使用以下代码

等2个属性创建视图模型
public class MyModel
{
    public List<ProductModel> Products { get; set; }
    public List<CustomerModel> Customers { get; set; }
}

在控制器中:

public ActionResult Index()
    {
        var model = new MyModel
        {
            Products = cm.Products.ToList(),
            Customers = cm.Customers.ToList()
        };
        return View(model);
    }

在Veiw

@foreach (var item in Model.Products)
{
   @*Write your razor code here*@
}