Простой способ потреблять / отображать RSS-канал в MVC ASP.NET - PullRequest
10 голосов
/ 07 ноября 2008

Я новичок в инфраструктуре MVC, и мне интересно, как передать данные RSS из контроллера в представление. Я знаю, что есть необходимость конвертировать в какой-то список IEnumerable. Я видел несколько примеров создания анонимного типа, но не могу понять, как преобразовать RSS-канал в общий список и передать его представлению.

Я не хочу, чтобы он также был строго напечатан, так как будет несколько звонков на различные RSS-каналы.

Любые предложения.

Ответы [ 4 ]

10 голосов
/ 07 ноября 2008

Я разыскивал способ создания веб-частей в MVC, которые в основном представляют собой пользовательские элементы управления, заключенные в контейнер веб-частей. Один из моих тестов UserControls - это элемент управления Rss Feed. Я использую расширение RenderAction HtmlHelper в dll Futures, чтобы отобразить его, чтобы вызывалось действие контроллера. Я использую класс SyndicationFeed для выполнения большей части работы

using (XmlReader reader = XmlReader.Create(feed))
{
    SyndicationFeed rssData = SyndicationFeed.Load(reader);

    return View(rssData);
 }

Ниже приведен контроллер и код UserControl:

Код контроллера:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;
using System.Xml;
using System.ServiceModel.Syndication;
using System.Security;
using System.IO;

namespace MvcWidgets.Controllers
{
    public class RssWidgetController : Controller
    {
        public ActionResult Index(string feed)
        {
            string errorString = "";

            try
            {
                if (String.IsNullOrEmpty(feed))
                {
                    throw new ArgumentNullException("feed");
                }
                    **using (XmlReader reader = XmlReader.Create(feed))
                    {
                        SyndicationFeed rssData = SyndicationFeed.Load(reader);

                        return View(rssData);
                    }**
            }
            catch (ArgumentNullException)
            {
                errorString = "No url for Rss feed specified.";
            }
            catch (SecurityException)
            {
                errorString = "You do not have permission to access the specified Rss feed.";
            }
            catch (FileNotFoundException)
            {
                errorString = "The Rss feed was not found.";
            }
            catch (UriFormatException)
            {
                errorString = "The Rss feed specified was not a valid URI.";
            }
            catch (Exception)
            {
                errorString = "An error occured accessing the RSS feed.";
            }

            var errorResult = new ContentResult();
            errorResult.Content = errorString;
            return errorResult;

        }
    }
}

UserControl

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Index.ascx.cs" Inherits="MvcWidgets.Views.RssWidget.Index" %>
<div class="RssFeedTitle"><%= Html.Encode(ViewData.Model.Title.Text) %> &nbsp; <%= Html.Encode(ViewData.Model.LastUpdatedTime.ToString("MMM dd, yyyy hh:mm:ss") )%></div>

<div class='RssContent'>
<% foreach (var item in ViewData.Model.Items)
   {
       string url = item.Links[0].Uri.OriginalString;
       %>
   <p><a href='<%=  url %>'><b> <%= item.Title.Text%></b></a>
   <%  if (item.Summary != null)
       {%>
        <br/> <%= item.Summary.Text %>
    <% }
   } %> </p>
</div>

с измененным кодом, чтобы иметь типизированную модель

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.ServiceModel.Syndication;

namespace MvcWidgets.Views.RssWidget
{
    public partial class Index : System.Web.Mvc.ViewUserControl<SyndicationFeed>
    {
    }
}
6 голосов
/ 30 июня 2010

@ Мэттью - идеальное решение - в качестве альтернативы коду, который нарушает концепцию MVC, вы можете использовать:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SyndicationFeed>" %>  
<%@ Import Namespace="System.ServiceModel.Syndication" %>
1 голос
/ 12 января 2012

Используя MVC, вам даже не нужно создавать представление, вы можете напрямую возвращать XML в программу чтения каналов, используя класс SyndicationFeed.

(Изменить) .NET ServiceModel.Syndication - Изменение кодировки в RSS-канале это лучший способ. (вместо этого перейдите по этой ссылке.)

http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed.aspx

public ActionResult RSS(string id)
{            
     return return File(MyModel.CreateFeed(id), "application/rss+xml; charset=utf-8");
}

In MyModel

CreateFeed(string id)
{ 
        SyndicationFeed feed = new SyndicationFeed( ... as in the MS link above)

        .... (as in the MS link)

        //(from the SO Link)
        var settings = new XmlWriterSettings 
        { 
           Encoding = Encoding.UTF8, 
           NewLineHandling = NewLineHandling.Entitize, 
           NewLineOnAttributes = true, 
           Indent = true 
        };
        using (var stream = new MemoryStream())
        using (var writer = XmlWriter.Create(stream, settings))
        {
            feed.SaveAsRss20(writer);
            writer.Flush();
            return stream.ToArray();
         }


}
0 голосов
/ 07 ноября 2008

RSS - это XML-файл со специальным форматом. Вы можете создать набор данных в этом общем формате и прочитать rss (xml) с помощью метода ReadXml, а URI - как путь к файлу. Тогда у вас есть набор данных, который вы можете использовать из других предложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...