2015-12-10 58 views
0

有一點問題,我自己無法解決。我想在一個視圖中使用相同的模型,但是一次使用IEnumerable <>,第二次使用時不使用它。正常模型和IEnumerable模型在相同的視圖

筆者認爲:

@model IEnumerable<AMBIT_CMS_MVC.Areas.Admin.Models.Product> 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>DYSKRET - FOLIE OKIENNE</title> 
    @Styles.Render("~/Content/Site.css") 
    @Styles.Render("~/Content/bootstrap.css") 
    @Scripts.Render("~/Scripts/jquery-1.10.2.min.js") 
    @Scripts.Render("~/Scripts/bootstrap.js") 
    @Scripts.Render("~/Scripts/buttons.js") 
</head> 
<body> 
    <div class="container-fluid okienne"> 
     <div class="row"> 
      <div class="col-sm-2"></div> 
      <div class="col-sm-8 menu"> 
       <a href="http://dyskret.pl/" target="_blank"> 
        <img src="~/Images/logo.png" class="img-responsive fimg" /> 
       </a> 
      </div> 
      <div class="col-sm-2"></div> 
     </div> 
     <div class="row"> 
      <div class="col-sm-2"></div> 
      <div class="col-sm-2 lista"> 
       <ul> 
        @foreach (var item in Model) 
        { 
         <li>@Html.ActionLink(item.Name, "Produkt", new { ProductID = item.ProductID })</li> 
        } 
       </ul> 
      </div> 
      <div class="col-sm-6 details"> 
       @Html.DisplayFor(m => m.Name) 
      </div> 
      <div class="col-sm-2"></div> 
     </div> 
     <div class="row"> 
      <div class="col-sm-2"></div> 
      <div class="col-sm-8 footerProducts"> 
       Text... 
      </div> 
      <div class="col-sm-2"></div> 
     </div> 
    </div> 
</body> 
</html> 

的問題是,foreach循環將很好地工作(我想列出此類別中的所有產品),但點擊時我想也顯示在右邊的是細節,但我不能因爲模型是IEnumerable <>而應該是簡單模型(AMBIT_CMS_MVC.Areas.Admin.Models.Product)。這就像我想在一個索引和詳細信息視圖。我怎樣才能做到這一點?

+0

所有你此刻的視圖顯示爲鏈接,所以當你點擊它,它會重定向,而不是在同一頁面上顯示它的細節。如果您確實想在同一頁面上顯示點擊項目的細節,那麼您需要ajax調用返回部分視圖(或json)並更新DOM的方法。除了'IEnumerable ' –

回答

0

好了,我想通了答案:

改變我的看法,以:

@model AMBIT_CMS_MVC.Models.ProductViewModel 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>DYSKRET - FOLIE OKIENNE</title> 
    @Styles.Render("~/Content/Site.css") 
    @Styles.Render("~/Content/bootstrap.css") 
    @Scripts.Render("~/Scripts/jquery-1.10.2.min.js") 
    @Scripts.Render("~/Scripts/bootstrap.js") 
    @Scripts.Render("~/Scripts/buttons.js") 
</head> 
<body> 
    <div class="container-fluid okienne"> 
     <div class="row"> 
      <div class="col-sm-2"></div> 
      <div class="col-sm-8 menu"> 
       <a href="http://dyskret.pl/" target="_blank"> 
        <img src="~/Images/logo.png" class="img-responsive fimg" /> 
       </a> 
      </div> 
      <div class="col-sm-2"></div> 
     </div> 
     <div class="row"> 
      <div class="col-sm-2"></div> 
      <div class="col-sm-2 lista"> 
       @Html.Partial("_Lista", Model.Products) 
      </div> 
      <div class="col-sm-6 details"> 
       @Html.Partial("_Produkt", Model.ProductDetails) 
      </div> 
      <div class="col-sm-2"></div> 
     </div> 
     <div class="row"> 
      <div class="col-sm-2"></div> 
      <div class="col-sm-8 footerProducts"> 
       Text... 
      </div> 
      <div class="col-sm-2"></div> 
     </div> 
    </div> 
</body> 
</html> 

_Lista部分:

@model IEnumerable<AMBIT_CMS_MVC.Areas.Admin.Models.Product> 

<ul> 
    @foreach (var item in Model) 
    { 
     <li>@Html.ActionLink(item.Name, "Produkt", new { ProductID = item.ProductID })</li> 
    } 
</ul> 

_Produkt部分:

@model AMBIT_CMS_MVC.Areas.Admin.Models.Product 

@Html.DisplayFor(m => m.Name) 
@Html.DisplayFor(m => m.Description) 

然後加入一類爲我的模型 - ProductViewModel(加入usings我的領域模型與他們合作,因爲這種模式以外地區):

using AMBIT_CMS_MVC.Areas.Admin.Models; 
namespace AMBIT_CMS_MVC.Models 
{ 
    public class ProductViewModel 
    { 
     public IEnumerable<Product> Products { get; set; } 
     public Product ProductDetails { get; set; } 
    } 
} 

最後改變了我的控制器:

public ActionResult Produkt(int? ProductID) 
     { 
      string domain = Request.Url.Host; 
      int clientid = (from a in db.Client where a.Domain == domain select a.ID).First(); 

      int categoryID = db.Category.Where(b => b.ClientID == clientid && b.Name == "Okienne").Select(b => b.ID).First(); 

      var ProductViewModel = new ProductViewModel(); 
      ProductViewModel.Products = db.Product.Where(c => c.ClientID == clientid && c.CategoryID == categoryID).ToList(); 
      ProductViewModel.ProductDetails = db.Product.SingleOrDefault(c => c.ClientID == clientid && c.CategoryID == categoryID && c.ProductID == ProductID); 

      return View(ProductViewModel); 

所以這裏是我如何做到的。希望它能幫助未來的開發者發生同樣的錯誤並面臨同樣的問題。

0

有幾種方法可以實現這一點。

  1. 使用視圖模型。通過利用圖模型,可以有各自作爲單獨的屬性:

    public class ProductViewModel 
    { 
        public IEnumerable<Product> AllProducts { get; set; } 
        public Product ActiveProduct { get; set; } 
    } 
    

    然後,可以使用迭代Model.AllProducts並顯示單個產品的用戶經由Model.ActiveProduct點擊。

  2. 使用部分並從列表中選擇一個產品傳遞給它。首先,這將需要您的型號爲List<Product>而不是IEnumerable<Product>。你不能同時遍歷和查詢一個枚舉。隨着這種變化,不過,你可以通過遍歷所有的產品,你現在是,然後只需通過渲染點擊的產品:

    @Html.Partial("_Product", Model.SingleOrDefault(m => m.ProductID == Request["ProductID"])) 
    

    技術上講,你甚至不用在這裏使用的部分。您可以將該查詢的結果設置爲Razor中的變量,然後利用該變量直接在相同視圖中呈現HTML。

  3. 使用兒童動作。通過兒童行動,您可以獲得完全獨立的環境,這意味着您可以爲視圖使用不同的模型。只需添加類似下面給你的控制器:

    [ChildActionOnly] 
    public ActionResult DisplayProduct(int productID) 
    { 
        var product = // retrieve product by id; 
        return PartialView("_Product", product); 
    } 
    

    然後,在你的看法:

    @Html.Action("DisplayProduct", new { productID = Request["productID"] }) 
    
+0

之外,完全沒有必要擁有'產品'在上述所有中,我得到這樣一個錯誤: System.InvalidOperationException:傳入字典的模型項類型爲'System.Data.Entity .DynamicProxies.Product_A7BFD8CBC1EFF80F0680459A04247BF1252FBF745FD7875CD7B2FE3DE3A233C2',但該字典需要類型爲'System.Collections.Generic.IEnumerable'1 [AMBIT_CMS_MVC.Areas.Admin.Models.Product]'的模型項。 第二個選項只會將IEnumerable更改爲List。 – Ashiv3r

+0

對於選項1,您需要傳遞視圖模型的實例並更改視圖的模型聲明來表示該視圖。對於選項2和3,您需要傳遞產品的實際列表。現在,根據錯誤,您只將一個模型實例發送到視圖。 –

0

使用Tuple法正常模式和IEnumerble模型

控制器:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using ProjectX.Models; 

namespace ProjectX.Controllers 
{ 
    public class StudentController : Controller 
    { 
     // GET: Student 
     public ActionResult Index() 
     { 
      ProjectX.DAL.ProjectContext db = new ProjectX.DAL.ProjectContext(); 
      // DAL is Data Access Layer Folder's name 

      return View(Tuple.Create<Student, IEnumerable<Student>>(new Student(), db.Student.ToList())); 
     } 
    } 
} 

查看:

@model Tuple<ProjectX.Models.Student,IEnumerable<ProjectX.Models.Student>> 

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_StudentLayout.cshtml"; 
} 

<table> 
    <thead> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1.student_name) 
     <th /> 
     <th> 
      @Html.DisplayNameFor(model => model.Item1.student_surname) 
     <th /> 
    <thead /> 
    <tbody> 
     @foreach (var item in Model.Item2) 
     { 
      <tr> 
       <td> 
        @Html.DisplayFor(modelItem => item.student_name) 
       </td> 
       <td> 
        @Html.DisplayFor(modelItem => item.student_surname) 
       </td> 
      </tr> 
     } 
    <tbody /> 
</table>