2008-11-07 9 views
10

Ich bin neu im MVC-Framework und frage mich, wie die RSS-Daten vom Controller an eine Ansicht übergeben werden. Ich weiß, dass es notwendig ist, in eine IEnumerable-Liste irgendeiner Art zu konvertieren. Ich habe einige Beispiele für die Erstellung eines anonymen Typs gesehen, kann aber nicht herausfinden, wie ich einen RSS-Feed in eine generische Liste umwandeln und an die Ansicht übergeben kann.Einfache Möglichkeit, RSS-Feed in MVC ASP.NET zu verwenden/anzuzeigen

Ich möchte nicht, dass es stark typisiert wird, da es mehrere Anrufe zu verschiedenen RSS-Feeds geben wird.

Irgendwelche Vorschläge.

Antwort

10

Ich habe mit einer Art von WebParts in MVC gespielt, die im Wesentlichen UserControls in einem WebPart-Container verpackt sind. Einer meiner Test-Benutzersteuerelemente ist ein Rss-Feed-Steuerelement. Ich verwende die RenderAction HtmlHelper-Erweiterung in der Futures-DLL, um sie anzuzeigen, so dass eine Controller-Aktion aufgerufen wird. Ich benutze die SyndicationFeed Klasse die meiste Arbeit

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

    return View(rssData); 
} 

Below zu tun ist, die Steuerung und Usercontrol-Code:

Der Controller-Code ist:

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; 

     } 
    } 
} 

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

mit dem Code hinter geändert, um ein typisiertes Modell

zu haben
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

Nizza, Sie haben mir ein großes Beispiel gegeben, mit zu arbeiten. – TriFatlete

+0

Ich bin froh, dass es geholfen hat. Ist Ihre Bewerbung gut gelaufen? – Matthew

+0

Nach ein paar Monaten habe ich es endlich geschafft, das zusammen zu stellen. Es hat perfekt funktioniert. Danke noch einmal. – TriFatlete

0

A rss ist eine XML-Datei mit einem speziellen Format. Sie können ein Dataset mit diesem generischen Format entwerfen und den rss (xml) mit der ReadXml-Methode und dem uri als Pfad zur Datei lesen. Dann haben Sie einen Datensatz, den Sie aus anderen Klassen konsumieren können.

6

@Matthew - perfekte Lösung - als eine Alternative, hinter dem codieren neigt dazu, das MVC-Konzept zu brechen, können Sie:

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

MVC verwenden Sie brauchen nicht einmal eine Ansicht zu erstellen, Sie können XML mithilfe der SyndicationFeed-Klasse direkt an den Feed-Reader zurückgeben.

(Bearbeiten) .NET ServiceModel.Syndication - Changing Encoding on RSS Feed Dies ist ein besserer Weg. (Schnippeln von diesem Link statt.)

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


} 
Verwandte Themen