2015-07-26 2 views
1

Я не уверен, как это сделать в MVC, в обычном коде я бы просто итератор в моем цикле и написал элемент, но я потерял это в MVC. В этой программе я читаю RSS-канал с сайта World of Warcraft. У меня есть этот метод:Итерация нескольких элементов из списка в MVC C#

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> 

Но мне нужно повторять, как это:

"item1" из "list1" => "item1" из "list2" => "item1" из "list3" => "item2" из "list1" => ETC ...

Я не знаю, как это сделать в этом представлении, может кто-нибудь мне помочь?

+0

Что значит «в нормальном коде» _? А что такое 'ViewBag.opis'? и какие списки вы имеете в виду? –

+0

@ StephenMuecke Конечно, я забыл добавить viewbags. Сожалею. VieBag.opis - это список , который содержит итоговые элементы. Под «нормальным кодом» я подразумеваю код в C#, в моем цикле foreach, а не в представлении. Я не носитель языка, поэтому его можно назвать другим. –

+0

Для меня похоже, что вы должны пойти с моделью не с ViewBag. Вы можете выполнять итерацию во всей сумке просмотра, но вам нужно отдать ее на какой-то тип - это динамический тип типа, разрешенный во время выполнения. Итак, вы можете повторять, но у вас нет интеллекта для этого. – MajkeloDev

ответ

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> 
} 
+0

Помните - используйте ViewBag только в том случае, если вы хотите передать немного лишних данных. Модельный подход намного лучше! (Вот почему он называется Model-View-Controller, а не ViewBag-View-Controller) – MajkeloDev

+0

Кто на самом деле дал это голос? –

+0

Мне тоже интересно. :) – MajkeloDev

0

Прежде всего, создайте новый класс, который будет хранить ваши данные.

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

Затем populdate список 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> 
+0

Не проверял код, потому что я прочь, но мне нравится эта идея! –

+0

Это должно вызывать исключение ... вызов Close on Disposed XmlReader, который в любом случае не доступен даже вне инструкции using. – MajkeloDev

+0

И вам больше не нужны эти ViewBags – MajkeloDev