2008-11-07 17 views
10

Soy nuevo en el framework MVC y me pregunto cómo pasar los datos RSS del controlador a una vista. Sé que hay una necesidad de convertir a una lista IEnumerable de algún tipo. He visto algunos ejemplos de cómo crear un tipo anónimo, pero no sé cómo convertir un canal RSS en una lista genérica y pasarlo a la vista.Manera fácil de consumir/mostrar información RSS en MVC ASP.NET

No quiero que se tipee fuertemente ya que habrá múltiples llamadas a varias fuentes RSS.

Cualquier sugerencia.

Respuesta

10

He estado jugando con una forma de hacer WebParts en MVC que son básicamente UserControls envueltos en un contenedor webPart. Uno de mis UserControls de prueba es un control de Feed Rss. Uso la extensión RenderAction HtmlHelper en el dll de Futures para mostrarla, de modo que se llame a una acción de controlador. Yo uso la clase SyndicationFeed hacer la mayoría del trabajo

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

    return View(rssData); 
} 

A continuación se muestra el controlador y el código de control de usuario:

El código del controlador es:

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; 

     } 
    } 
} 

El control de usuario

<%@ 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> 

con el código modificado para tener un modelo escrito

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

Niza, que me has dado un gran ejemplo para trabajar con ellos. – TriFatlete

+0

Me alegra que haya ayudado. ¿Tu aplicación salió bien? – Matthew

+0

Después de unos meses, finalmente tuve que armar esto. Funcionó perfectamente. Gracias de nuevo. – TriFatlete

0

A rss es un archivo xml con formato especial. Puede diseñar un conjunto de datos con ese formato genérico y leer el rss (xml) con el método ReadXml y el uri como la ruta al archivo. Luego tienes un conjunto de datos que puedes consumir de otras clases.

6

@Matthew - solución perfecta - como alternativa al código detrás de la cual tiende a romper el concepto de MVC, puede utilizar:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SyndicationFeed>" %> 
<%@ Import Namespace="System.ServiceModel.Syndication" %> 
1

El uso de MVC que ni siquiera necesita para crear una vista, puede devolver directamente XML al lector de feeds utilizando la clase SyndicationFeed.

(Editar) .NET ServiceModel.Syndication - Changing Encoding on RSS Feed esta es una manera mejor. (SNIP desde este enlace en su lugar.)

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"); 
} 

En 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(); 
     } 


} 
Cuestiones relacionadas