【问题标题】:Iterating multiple items from list in MVC C#从MVC C#中的列表中迭代多个项目
【发布时间】:2015-07-26 09:29:34
【问题描述】:

我不确定如何在 MVC 中执行此操作,在普通代码中我只会在循环中迭代并编写项目,但我在 MVC 中迷失了这样做。在这个程序中,我正在阅读来自魔兽世界网站的 RSS 提要。 我有这个方法:

public ActionResult Bar()
{
    List<string> temat = new List<string>();
    List<string> podpis = new List<string>();
    List<DateTime> czas = new List<DateTime>();
    string url = "http://eu.battle.net/wow/en/feed/news";
    using (XmlReader reader = XmlReader.Create(url))
    {
        SyndicationFeed feed = SyndicationFeed.Load(reader);

        foreach (SyndicationItem item in feed.Items)
        {
            String subject = item.Title.Text;
            String summary = item.Summary.Text;
            DateTime date = item.PublishDate.DateTime;

            temat.Add(subject);
            podpis.Add(summary);
            czas.Add(czasy);
        }
    }
    reader.Close();
    ViewBag.tytul = temat;
    ViewBag.opis = podpis;
    ViewBag.c = czas;
    return PartialView("_Bar");
}

在我的 partialView 中,我可以像这样从 ViewBag 获取每个项目:

<div class="row">
    @foreach (var o in ViewBag.opis)
    {
        <p>@Html.Raw(@o)</p>
    }
</div>

但我需要像这样迭代:

“list1”中的“item1”=>“list2”中的“item1”=>“list3”中的“item1” => "list1" 中的 "item2" => ETC...

我不知道如何在此视图中执行此操作,有人可以帮助我吗?

【问题讨论】:

  • 你是什么意思“在普通代码中”ViewBag.opis 是什么?您指的是哪些列表?
  • @StephenMuecke 当然我忘了添加viewbags。对不起。 VieBag.opis 是 list ,其中包含摘要项。 “普通代码”是指 C# 中的代码,在我的 foreach 循环中,而不是在视图中。我不是母语人士,所以它可能被称为不同。
  • 对我来说,您应该使用模型而不是 ViewBag。您可以在整个 viewbag 中进行迭代,但您需要将其转换为某种类型——它是一种动态类型——在运行时解析的类型。所以你可以迭代,但你没有智能感知。

标签: c# asp.net-mvc asp.net-mvc-4 foreach partial-views


【解决方案1】:

因此,您需要为其创建一个类,因为您的方法毫无意义。 让我们创建一个类:

public class MyModel
{
  public string Topic { get; set; }
  public string Signature { get; set; }
  public DateTime Time { get; set; }
}

稍后让我们将您的控制器更改为:

public ActionResult Bar()
{
    List<MyModel> _model = new List<MyModel>();
    using (XmlReader reader = XmlReader.Create(url))
    {
        SyndicationFeed feed = SyndicationFeed.Load(reader);

        foreach (SyndicationItem item in feed.Items)
        {
            var newItem = new MyModel();
            newItem.Topic = item.Title.Text;
            newItem.Signature = item.Summary.Text;
            newItem.Time = item.PublishDate.DateTime;

            _model.Add(newItem);
        }
    }
    return PartialView("_Bar", _model); 
}

现在您在您的视图中拥有强类型模型,因此只需在顶部添加一个命名空间(假设 MyModel 在 xxx.Models 命名空间中):

@model  IEnumerable <xxx.Models.MyModel>

现在您可以使用 intellisense 迭代整个过程:

@foreach (var item in Model)
{
    <p>item.Topic</p>
    <p>item.Signature</p>
    <p>item.Time</p>
}

【讨论】:

  • 记住——只有当你想传递一些额外的数据时才使用 ViewBag。模型方法要好得多!(这就是为什么它被称为 Model-View-Controller 而不是 ViewBag-View-Controller)
【解决方案2】:

首先,构建一个新类来保存您的数据。

Class WOWClass
{
    public string temat {get;set;}
    public DateTime czas {get;set;}
}

然后填充 WOWClass 列表而不是 3 个列表...

public ActionResult Bar()
{
    List<WOWClass> list = new List<WOWClass>();
    string url = "http://eu.battle.net/wow/en/feed/news";
    using (XmlReader reader = XmlReader.Create(url))
    {
        SyndicationFeed feed = SyndicationFeed.Load(reader);

        foreach (SyndicationItem item in feed.Items)
        {
            //populate your list
        }
    }
    return PartialView("_Bar", list);
}

最后是这个视图:

<div class="row">
    @foreach (var o in Model)
    {
        Temat: <p>@Html.Raw(o.temat)</p>
        Czas: <p>@Html.Raw(o.czas)</p>
    }
</div>

【讨论】:

  • 没有测试代码,因为我不在,但我喜欢这个主意!
  • 这应该引发异常...在 Disposed XmlReader 上调用 Close,无论如何 - 在 using 语句之外甚至无法访问。
  • 你不再需要这个 ViewBags
猜你喜欢
  • 2014-10-26
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多