سؤال

كيف يمكنك أن ريككوميند التعامل مع آر إس إس في ASP.NET MVC?باستخدام طرف ثالث المكتبة ؟ باستخدام RSS الاشياء في BCL ؟ مجرد جعل RSS الرأي أن يجعل XML ؟ أو شيء مختلف تماما ؟

هل كانت مفيدة؟

المحلول

هنا هو ما أوصي بما يلي:

  1. إنشاء فئة تسمى RssResult أن يرث من الفئة الأساسية مجردة ، ActionResult.
  2. تجاوز ExecuteResult الأسلوب.
  3. ExecuteResult لديه ControllerContext مرت بها المتصل و مع هذا يمكنك الحصول على البيانات و نوع المحتوى.
  4. بمجرد تغيير نوع المحتوى rss, سوف تحتاج إلى إجراء تسلسل البيانات في آر إس إس (باستخدام التعليمات البرمجية الخاصة بك أو مكتبة أخرى) والكتابة إلى الاستجابة.

  5. إنشاء إجراء على وحدة تحكم التي تريد العودة rss و تعيين نوع الإرجاع كما RssResult.الاستيلاء على البيانات من النموذج الخاص بك بناء على ما كنت ترغب في العودة.

  6. ثم أي طلب أن هذا العمل سوف تتلقى آر إس إس من أي البيانات التي تختارها.

هذا هو على الارجح أسرع و قابلة لإعادة الاستخدام طريق العودة rss لديه استجابة لطلب في ASP.NET MVC.

نصائح أخرى

على .NET framework يعرض الفئات التي تتعامل مع syndation:SyndicationFeed.... الخلذا بدلا من تقديم نفسك أو باستخدام بعض البعض اقترح RSS مكتبة لماذا لا ندع إطار تأخذ الرعاية من ذلك ؟

أساسا كنت فقط بحاجة التالية مخصصة ActionResult وكنت على استعداد للذهاب:

public class RssActionResult : ActionResult
{
    public SyndicationFeed Feed { get; set; }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.ContentType = "application/rss+xml";

        Rss20FeedFormatter rssFormatter = new Rss20FeedFormatter(Feed);
        using (XmlWriter writer = XmlWriter.Create(context.HttpContext.Response.Output))
        {
            rssFormatter.WriteTo(writer);
        }
    }
}

الآن في وحدة التحكم الخاصة بك يمكنك العودة ببساطة التالية:

return new RssActionResult() { Feed = myFeedInstance };

هناك عينة كاملة على بلدي بلوق في http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/

أنا أتفق مع Haacked.أنا حاليا تنفيذ الموقع/بلوق باستخدام إطار MVC و ذهبت مع مقاربة بسيطة إنشاء طريقة عرض جديدة لـ RSS:

<%@ Page ContentType="application/rss+xml" Language="C#" AutoEventWireup="true" CodeBehind="PostRSS.aspx.cs" Inherits="rr.web.Views.Blog.PostRSS" %><?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>ricky rosario's blog</title>
<link>http://<%= Request.Url.Host %></link>
<description>Blog RSS feed for rickyrosario.com</description>
<lastBuildDate><%= ViewData.Model.First().DatePublished.Value.ToUniversalTime().ToString("r") %></lastBuildDate>
<language>en-us</language>
<% foreach (Post p in ViewData.Model) { %>
    <item>
    <title><%= Html.Encode(p.Title) %></title>
    <link>http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %></link>
    <guid>http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %></guid>
    <pubDate><%= p.DatePublished.Value.ToUniversalTime().ToString("r") %></pubDate>
    <description><%= Html.Encode(p.Content) %></description>
    </item>
<% } %>
</channel>
</rss>

للحصول على مزيد من المعلومات ، راجع (وقح المكونات) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

مجنون آخر النهج ، ولكن لها ميزة ، هو استخدام العادي .aspx عرض لتقديم RSS.في الخاص بك طريقة عمل فقط تحديد المحتوى الملائم لكل نوع.واحد الاستفادة من هذا النهج هو أنه من السهل أن نفهم ما يجري المقدمة و كيفية إضافة عناصر مخصصة مثل تحديد الموقع الجغرافي.

ثم مرة أخرى, النهج الأخرى المدرجة قد يكون أفضل, أنا فقط لم تستخدم لهم.;)

حصلت على هذا من عيران كفاحي و سكوت Hanselman فيد (نسيت الرابط) حتى إنها فقط مختلفة قليلا عن بعض الوظائف الأخرى هنا ، ولكن نأمل مفيدة و نسخ لصق جاهز كمثال تغذية rss.

من بلدي بلوق

عيران كفاحي

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

namespace MVC3JavaScript_3_2012.Rss
{
    public class RssFeed : FileResult
    {
        private Uri _currentUrl;
        private readonly string _title;
        private readonly string _description;
        private readonly List<SyndicationItem> _items;

        public RssFeed(string contentType, string title, string description, List<SyndicationItem> items)
            : base(contentType)
        {
            _title = title;
            _description = description;
            _items = items;
        }

        protected override void WriteFile(HttpResponseBase response)
        {
            var feed = new SyndicationFeed(title: this._title, description: _description, feedAlternateLink: _currentUrl,
                                           items: this._items);
            var formatter = new Rss20FeedFormatter(feed);
            using (var writer = XmlWriter.Create(response.Output))
            {
                formatter.WriteTo(writer);
            }
        }

        public override void ExecuteResult(ControllerContext context)
        {
            _currentUrl = context.RequestContext.HttpContext.Request.Url;
            base.ExecuteResult(context);
        }
    }
}

وحدة تحكم التعليمات البرمجية....

    [HttpGet]
public ActionResult RssFeed()
{
    var items = new List<SyndicationItem>();
    for (int i = 0; i < 20; i++)
    {
        var item = new SyndicationItem()
        {
            Id = Guid.NewGuid().ToString(),
            Title = SyndicationContent.CreatePlaintextContent(String.Format("My Title {0}", Guid.NewGuid())),
            Content = SyndicationContent.CreateHtmlContent("Content The stuff."),
            PublishDate = DateTime.Now
        };
        item.Links.Add(SyndicationLink.CreateAlternateLink(new Uri("http://www.google.com")));//Nothing alternate about it. It is the MAIN link for the item.
        items.Add(item);
    }

    return new RssFeed(title: "Greatness",
                       items: items,
                       contentType: "application/rss+xml",
                       description: String.Format("Sooper Dooper {0}", Guid.NewGuid()));

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top