将不同的数据返回到各种视图部分

时间:2017-04-27 12:42:18

标签: sql asp.net-mvc entity-framework

我有一个"最受欢迎" div目前正在展示最受欢迎的拍卖品以及即将结束的" Ending Soon" div,我想显示那些即将结束的拍卖。我已经成功查询了数据库中的" Most Popluar"并将这些结果返回到页面。而且我知道查询对于那些即将结束的人来说是什么,但是如何将两组数据都返回到页面以进行部分视图" _AuctionTile"用吗?

以下更新反映了Vinutha N提出的建议 -

视图

@model IEnumerable<MyAuctionApp.Models.Auction>

@{
ViewBag.Title = "Home Page";
}

<div class="row">

    <div id="popular" class="col-md-4 col-lg-4">
        <h2>Most Popular Items</h2>

        @foreach (var item in Model.mostPopularItems)
        {
            @Html.Partial("_AuctionTile", item)

        }
</div>

<div id="ending" class="col-md-4 col-lg-4">
      <h2>Auctions Ending Soon</h2>
       @foreach (var item in Model)
        {
           @Html.Partial("_AuctionTile", item)
        }
 </div>

ViewModel

using MyAuctionApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MyAuctionApp.ViewModels
{

public class AuctionViewModel
    {
    public static List<Auction> mostPopularItems;
    public static List<Auction> endingSoon;

        public AuctionViewModel(AuctionsDataContext db)
        {
        mostPopularItems = db.Auctions.Where(x => x.EndTime > 
DateTime.Today).OrderByDescending(x => x.viewCount).ToList();
        endingSoon = db.Auctions.Where(x => x.EndTime > 
DateTime.Today).OrderByDescending(x => x.EndTime).ToList();
        }
   }
}

控制器

using MyAuctionApp.Models;
using MyAuctionApp.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MyAuctionApp.Controllers
{
    [AllowAnonymous]
    public class HomeController : Controller

      {
        [AllowAnonymous]
        public ActionResult Index()
        {
        var db = new AuctionsDataContext();
       var dataModuleObject = new AuctionViewModel(db);
       return View(dataModuleObject);

      //var auctions = db.Auctions.ToArray();
     //var auctions = db.Auctions.Where(x => x.EndTime > 
     //DateTime.Today).OrderByDescending(x => x.viewCount);
     //return View(auctions);
         }
     }

正如您从附带的屏幕截图中看到的那样,&#39; mostPopularItems&#39; 在AuctionViewModel中初始化的属性未被选中 由Intellisense作为现有的,在行

    @foreach (var item in Model.mostPopularItems)

我还有什么不对?

enter image description here

谢谢, CM

4 个答案:

答案 0 :(得分:1)

使用子操作。首先,在AuctionController上创建以下操作:

[ChildActionOnly]
public ActionResult MostPopular()
{
    // get most popular auctions
    return PartialView("_AuctionTile", auctions);
}

[ChildActionOnly]
public ActionResult EndingSoon()
{
    // get auctions ending soon
    return PartialView("_AuctionTile", auctions);
}

然后,在您的视图中,您希望每个人都显示:

@Html.Action("MostPopular")
@Html.Action("EndingSoon")

您的主视图模型应该只关注它需要做什么,而不是像这些一样。

<强>更新

抱歉,我没注意你的HTML。基本上,您需要为每个部分创建一个部分,然后。例如:

<强> _MostPopular.cshtml

@model IEnumerable<Auction>
<div id="popular" class="col-md-4 col-lg-4">
    <h2>Most Popular Items</h2>
    @foreach (var item in Model)
    {
        @Html.Partial("_AuctionTile", item)
    }  
</div> 

然后,更改子操作以返回此操作:

return PartialView("_MostPopular", auctions);

这里的关键是子操作创建了一个单独的上下文,您可以在其中专门为此局部视图构建视图模型,而不会影响主视图中的内容。

<强>奖金

显示模板在这里也可以提供很多帮助。例如,如果您可以创建类似Views\Shared\DisplayTemplates\Auction.cshtml的视图。然后,只要您使用Html.DisplayFor实例调用Auction,它就会自动使用该视图进行渲染。此外,Html.DisplayFor也可以处理可枚举。它将简单地使用包含类型的显示模板来呈现列表中的每个项目。因此,在您的代码中,您可以简单地执行以下操作,而不是遍历Model中的项目并为每个项目呈现部分视图:

@model IEnumerable<Auction>
<div id="popular" class="col-md-4 col-lg-4">
    <h2>Most Popular Items</h2>
    @Html.DisplayForModel()
</div> 

答案 1 :(得分:0)

在模型中声明2列表并将数据分配给列表。在html页面中使用foreach中的特定列表属性。 喜欢,

model.Popularitems Model.Endingitems

答案 2 :(得分:0)

如上所述创建视图模型,或者您可以在视图包中传递额外数据,就像您可以设置的控制器一样 ViewBag.endingSoon = yourCollection 并在您的视图中使用它 希望它会有所帮助

答案 3 :(得分:0)

首先你需要申报2个列表, 列出您正在使用的视图模型中的热门项目和列表结束(如果没有创建并使用它的最佳实践。因为您无法在控制器中执行)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    namespace DataViewModel.ViewModels
    {
        public class DataViewModel
{
    public list<Auctions> Popularitem { get; set; }
    public list<Auctions> endingSoon { get; set; }
    public CustomerViewModel((datatype)db)
    {
        list<Auctions> Popularitem=db.Auctions.Where(x => x.EndTime > DateTime.Today).OrderByDescending(x => x.viewCount);

    list<Auctions> endingSoon =db.Auctions.Where(x => x.EndTime > DateTime.Today).OrderByDescending(x => x.viewCount);
    }
}
}

in controller 
public ActionResult Index()
    {
        var db = new AuctionsDataContext();
        datamoduleobject= new Dataviewmodel(db);
        return View(datamoduleobject);
    }

in view :
@MyProject.Web.ViewModels.DataViewModel
<div id="popular" class="col-md-4 col-lg-4">
        <h2>Most Popular Items</h2>
        @foreach (var item in Model.Popularitem)
        {
            @Html.Partial("_AuctionTile", item)
        }  
</div>

<div id="ending" class="col-md-4 col-lg-4">
      <h2>Auctions Ending Soon</h2>
       @foreach (var item in Model.endingSoon)
        {
           @Html.Partial("_AuctionTile", item)
        }
 </div>

请浏览我提供的链接,以帮助您理解http://tutlane.com/tutorial/aspnet-mvc/how-to-use-viewmodel-in-asp-net-mvc-with-example