2008-11-07 6 views
10

Je suis nouveau dans le framework MVC et je me demande comment passer les données RSS du contrôleur à une vue. Je sais qu'il est nécessaire de convertir en une liste IEnumerable de quelque sorte. J'ai vu quelques exemples de création d'un type anonyme mais je n'arrive pas à comprendre comment convertir un flux RSS en une liste générique et le passer à la vue.Manière simple de consommer/afficher le flux RSS dans MVC ASP.NET

Je ne veux pas qu'il soit fortement typé, car il y aura plusieurs appels à divers flux RSS.

Toutes les suggestions.

Répondre

10

J'ai joué avec une façon de faire des WebParts dans MVC qui sont essentiellement des UserControls enveloppés dans un conteneur webPart. Un de mes tests UserControls est un contrôle de flux Rss. J'utilise l'extension RenderAction HtmlHelper dans la DLL Futures pour l'afficher afin qu'une action de contrôleur soit appelée. J'utilise la classe SyndicationFeed pour faire la plupart des travaux

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

    return View(rssData); 
} 

Voici le contrôleur et le code UserControl:

Le code du contrôleur est:

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; 

     } 
    } 
} 

Le 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> 

avec le code derrière modifié pour avoir un dactylographié Modèle

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

Nice, vous me avez donné un excellent exemple pour travailler avec. – TriFatlete

+0

Je suis content que ça a aidé. Votre application s'est bien déroulée? – Matthew

+0

Après quelques mois, j'ai finalement réussi à mettre cela ensemble. Cela a fonctionné parfaitement. Merci encore. – TriFatlete

0

Un rss est un fichier xml avec un format spécial. Vous pouvez concevoir un jeu de données avec ce format générique et lire le rss (xml) avec la méthode ReadXml et l'uri comme chemin d'accès au fichier. Ensuite, vous avez un jeu de données que vous pouvez utiliser dans d'autres classes.

6

@Matthew - solution parfaite - comme alternative au code derrière qui tend à briser le concept MVC, vous pouvez utiliser:

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

En utilisant MVC vous ne même pas besoin de créer une vue, vous pouvez directement renvoyer le code XML au lecteur de flux à l'aide de la classe SyndicationFeed.

(Éditer) .NET ServiceModel.Syndication - Changing Encoding on RSS Feed c'est une meilleure façon. (SNIP de ce lien à la place.)

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

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


}