Custom Presenters

In most applications, you have several situations where you need to generate some XML, JSON or other type of a content (RSS feed etc.), or just compose the HTTP response yourself.

In both OWIN and ASP.NET Core, you can write your own middleware which handles the communication, or you can use another framework for that (e.g. ASP.NET Web API for REST interfaces).

But sometimes you need to integrate with various DotVVM services (e.g. routing), or you just don't want to introduce additional libraries in your project. That's the situation when you need a custom presenter. It is a lightweight alternative to OWIN middleware which lets you to handle the HTTP request yourself, and flawlessly integrates with DotVVM routing.

To create a custom presenter, you have to create a class that implements the IDotvvmPresenter interface. In the ProcessRequest method you can handle the OWIN request yourself. The main advantage of custom presenter over the middleware is that you can use DotVVM routes, use route parameters, action filters and you also have the Request Context object.

    public class RssPresenter : IDotvvmPresenter
    {
        ...

        public Task ProcessRequest(IDotvvmRequestContext context)
        {
            context.GetOwinContext().Response.ContentType = "application/rss+xml";

            // load data
            var articles = ...;
            
            // generate RSS feed
            var items = articles
                .Select(a =>
                {
                    var item = new SyndicationItem(a.Title, a.Description, a.Url)
                    {
                        PublishDate = a.BeginDate
                    };
                    item.Authors.Add(new SyndicationPerson() { Name = a.AuthorName });
                    return item;
                });

            // create feed
            var feed = new SyndicationFeed("Sample RSS Feed", "DotVVM Sample", new Uri("https://www.dotvvm.com"), items);

            // write the XML to the output
            var writer = XmlWriter.Create(context.GetOwinContext().Response.Body, new XmlWriterSettings() { Indent = true });
            feed.SaveAsRss20(writer);
            writer.Flush();

            return Task.FromResult(0);
        }
    }
}

Finally, you have to register the presenter in the DotvvmStartup.cs file:

config.RouteTable.Add("Rss", "feeds/rss", null, null, () => new RssPresenter());

On this page