<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BrightMix &#187; Blog</title>
	<atom:link href="http://www.brightmix.com/blog/category/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brightmix.com</link>
	<description></description>
	<lastBuildDate>Mon, 08 Feb 2010 05:36:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>BrightMix 2.0 &#8211; Transitioning to a Product Company</title>
		<link>http://www.brightmix.com/blog/brightmix-2-0-transitioning-to-a-product-company/</link>
		<comments>http://www.brightmix.com/blog/brightmix-2-0-transitioning-to-a-product-company/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 19:08:03 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[About]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[Running a Business]]></category>

		<guid isPermaLink="false">http://www.brightmix.com/?p=2963</guid>
		<description><![CDATA[Back when we started BrightMix, Dusty and myself set out to with the goal of one day becoming a product company. That is, a company that builds and maintains its own software products. The biggest challenge with this approach is products don&#8217;t start churning over cash on day one; you have to build them, enhance [...]]]></description>
			<content:encoded><![CDATA[<p><span class="highlight">Back when we started BrightMix, Dusty and myself set out to with the goal of one day becoming a product company</span>. That is, a company that builds and maintains its own software products. The biggest challenge with this approach is products don&#8217;t start churning over cash on day one; you have to build them, enhance them, market them, and most importantly, sell them. We needed a revenue stream to keep us afloat while our products were being developed. So, what did we do? Like many other companies out there, we bootstrapped by doing consulting work for other companies.</p>
<p>In the past two and a half years, we&#8217;ve built and launched many websites and web-applications for our clients, all of which we&#8217;re quite proud of. We gained a lot of experience and learned a lot about project management, scheduling, client relationships, and all of that fun stuff. We worked diligently and put in a lot of long days and nights to meet deadlines and keep our clients happy.</p>
<p>All the while we&#8217;ve been consulting, Dusty and myself have poured countless hours into our products: <a href="http://www.tripleseat.com">Tripleseat.com</a> and <a href="http://www.siliconprairienews.com">SiliconPrairieNews.com</a>. We&#8217;ve been splitting our time and focus between consulting and our products, which has been nothing short of difficult, stressful, and time consuming. (If we focus on the consulting side of our business, the product side suffers and vice versa.) Nonetheless, both SPN and Tripleseat have gained considerable traction and momentum over the last year, and, as founders, the need for us to dedicate ourselves fully to these endeavors has become paramount. <span class="highlight">As a result, we&#8217;ve decided that we will be halting consulting work and focusing 100% of our efforts on our products</span>. It&#8217;s something that we&#8217;ve always wanted to do and there&#8217;s no better time to act on it than now.</p>
<blockquote><p><strong>Note to all of our current clients</strong>: We will honor all outstanding projects to which we&#8217;ve committed. Additionally, we will continue to support and maintain all projects we&#8217;ve built.</p>
<p>However, we will want to transition ourselves out of any and all support and maintenance roles as quickly and realistically as possible. We will be touching base with all of our current clients over the next week to determine the best plan of action moving forward.</p>
<p><span class="highlight">Lastly, suffice to say, we will not be accepting any new projects going forward.</span></p></blockquote>
<p>Ideally, our transition from a consulting shop to a product shop would be seamless, and we&#8217;d be able to find a home for all current employees in our reorganized company. <span class="highlight">Unfortunately, in the short term, sans consulting revenue, we would not be able to financially support either of the Erins so we&#8217;ve had to let them go. It&#8217;s one of the hardest business decisions we&#8217;ve   faced; they&#8217;re two of the best employees one could hope for</span>. So, any of you out there who are looking for a talented developer or designer, let us know and we&#8217;ll be happy to get you in contact with them.. or you can simply email <a href="mailto:erin.e.hawkins@gmail.com">Erin Hawkins</a> or <a href="mailto:erin@tinyxl.com">Erin Standley</a> directly (click on their names for their email addresses) or find them on twitter: <a href="http://twitter.com/erinhawkins">@erinhawkins</a>, <a href="http://twitter.com/tinyxl">@tinyxl</a>.</p>
<h2>What Lies Ahead</h2>
<p>We&#8217;re <strong>very</strong> excited for what lays ahead for both Tripleseat.com and SiliconPrairieNews.com.  We&#8217;re aiming to grow these companies to the point where they are wildly successful. Both of these products will almost certainly grow to the point where we will need to hire on people, need more or additional space, take on funding, etc. For the time being, both SPN and Tripleseat will continue to operate out of our current office in mid-town Omaha. We&#8217;ll be bunking down, working hard, and  knocking these products out of the park.</p>
<p>More to follow in the specifics of each of our software / company endeavors. For now, thanks to everyone who has been a supporter, client, friend and follower of BrightMix over the past two and a half years. It has been a fantastic run up to this point, and we&#8217;re more excited than ever for what&#8217;s in store.</p>
<p>BrightMix Founders,<br />
Dusty &amp; Kevin</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/brightmix-2-0-transitioning-to-a-product-company/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BrightMix &#8220;Amazing&#8221; Party &#8211; Friday, Feb 13th</title>
		<link>http://www.brightmix.com/blog/brightmix-amazing-party-friday-feb-13th/</link>
		<comments>http://www.brightmix.com/blog/brightmix-amazing-party-friday-feb-13th/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 17:40:13 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.brightmix.com/?p=2442</guid>
		<description><![CDATA[
It&#8217;s that time again that never was before:
BrightMix&#8217;s Friday the 13th &#8220;Amazing&#8221; Party Party at 5pm
Join us after work for cupcakes, a Valentine&#8217;s Day pre-party, and multiple birthday celebrations (Erin #1, Dusty, Sarah Palin, Chuck Yeager, Peter Tork, Jerry Springer, Peter Gabriel, Henry Rollins, AND Mena Suvari). Or, you could choose to celebrate the 28th [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.brightmix.com/wp-content/uploads/2009/01/cupcakelg-2.jpg"><img class="alignnone size-full wp-image-2463" title="cupcake_blog" src="http://www.brightmix.com/wp-content/uploads/2009/01/cupcake_blog-4.jpg" alt="cupcake_blog" width="718" height="300" /></a></p>
<p>It&#8217;s that time again that never was before:</p>
<h2><span class="highlight">BrightMix&#8217;s Friday the 13th &#8220;Amazing&#8221; Party Party<span> at 5pm</span></span></h2>
<p>Join us after work for cupcakes, a Valentine&#8217;s Day pre-party, and multiple birthday celebrations (Erin #1, Dusty, Sarah Palin, Chuck Yeager, Peter Tork, Jerry Springer, Peter Gabriel, Henry Rollins, AND Mena Suvari). Or, you could choose to celebrate the 28th anniversary of the Louisville sewer explosions&#8230;or maybe you&#8217;re more into those Jason films&#8230;whatever you feel like celebrating, do it at BrightMix.</p>
<p>We&#8217;ll have the basics: cupcakes, drinks, napkins, and probably some sort of music. Bringing cupcakes is encouraged; <em>even more highly encouraged is eating cupcakes</em>.</p>
<p><em>p.s. please leave us a comment if you plan on stopping by&#8230;<br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/brightmix-amazing-party-friday-feb-13th/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Congrats Dusty &#8211; MBJ 40 Under 40</title>
		<link>http://www.brightmix.com/blog/congrats-dusty-mbj-40-under-40/</link>
		<comments>http://www.brightmix.com/blog/congrats-dusty-mbj-40-under-40/#comments</comments>
		<pubDate>Mon, 08 Dec 2008 06:36:00 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.brightmix.com//2008/12/09/congrats-dusty-mbj-40-under-40</guid>
		<description><![CDATA[Our very own Dusty has been selected as one of the Midlands Business Journal’s 40 Under 40 for 2008. This award goes to entrepreneurs and young professionals in the Omaha area, who are making a difference in their businesses and within the community. As part of the award, there was a bio and photo in [...]]]></description>
			<content:encoded><![CDATA[<p>Our very own Dusty has been selected as one of the <a href="http://www.mbj.com">Midlands Business Journal’s</a> <em><a href="http://www.siliconprairienews.com/2008/11/midlands-business-journal-40-under-40">40 Under 40</a></em> for 2008. This award goes to entrepreneurs and young professionals in the Omaha area, who are making a difference in their businesses and within the community. As part of the award, there was a bio and photo in last week’s Midlands Business Journal, as well as a breakfast honoring all of the award recipients. Oh, and a shiny plaque with his picture on it!</p>
<p>Congrats to Dusty and to all of the winners! Check out <a href="http://www.siliconprairienews.com">Silicon Prairie News</a> for a complete list of all of the <a href="http://www.siliconprairienews.com/2008/11/midlands-business-journal-40-under-40/">40 Under 40 award recipients</a></p>
<blockquote><p>As one of the co-founders of a growing Web development company BrightMix, Dusty Davidson launched a product called TripleSeat during the first year in business; TripleSeat is a service providing a new option for businesses in the restaurant industry and is meeting goals of steady, organic growth.</p>
<p>Davidson and BrightMix co-founder Kevin Zink sought to bring their vision of business to fruition, and their company took shape from origins in consulting from a home office, leading to a move this year into a midtown office.</p>
<p>BrightMix has provided internships for students and has grown in employees and revenue since it got off the ground in 2007. Not only is Davidson an entrepreneur, he is involved in the promotion of other Omaha entrepreneurs via several projects: He helps run the Web site Silicon Prairie News, which spotlights Nebraska entrepreneurs and innovators with goals of pushing forward ideas that encourage Omaha’s viability as a city for creativity and innovation. Aiming for weekly interviews, the Web site’s founders promote news items that might otherwise be flying under the radar.</p>
<p>This year Davidson was involved in creating Omaha’s first BarCamp, a gathering to bring together entrepreneurs, innovators, technologists and others.</p>
<p>Davidson is an original member of the Greater Omaha Chamber of Commerce’s Cornstalks group for entrepreneurs and inventors. Davidson has been involved in helping to organize networking and informal educational events through Cornstalks.</p>
<p>Davidson has a bachelor’s in computer science from Iowa State University and has five years experience in his field.</p></blockquote>
<div style="text-align:center"><a title="Dusty on the big screen by BrightMix, on Flickr" href="http://www.flickr.com/photos/brightmix/3092043306/"><img class="flickr_img" src="http://farm4.static.flickr.com/3109/3092043306_31d7874645.jpg" alt="Dusty on the big screen" width="500" height="334" /></a></p>
<p><a title="Dusty &amp; Marlina at MBJ 40 Under 40 Breakfast by BrightMix, on Flickr" href="http://www.flickr.com/photos/brightmix/3092044798/"><img class="flickr_img" src="http://farm4.static.flickr.com/3150/3092044798_f97b675a14.jpg" alt="Dusty &amp; Marlina at MBJ 40 Under 40 Breakfast" width="500" height="334" /></a></p>
<p><a title="Jeff &amp; Dusty at MBJ 40 Under 40 Breakfast by BrightMix, on Flickr" href="http://www.flickr.com/photos/brightmix/3092043838/"><img class="flickr_img" src="http://farm4.static.flickr.com/3261/3092043838_670cda2ac4.jpg" alt="Jeff &amp; Dusty at MBJ 40 Under 40 Breakfast" width="500" height="334" /></a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/congrats-dusty-mbj-40-under-40/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Web Apps We&#8217;re Thankful For</title>
		<link>http://www.brightmix.com/blog/web-apps-we-are-thankful-for/</link>
		<comments>http://www.brightmix.com/blog/web-apps-we-are-thankful-for/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 17:07:00 +0000</pubDate>
		<dc:creator>erin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Holidays]]></category>

		<guid isPermaLink="false">http://www.brightmix.com//2008/11/27/web-apps-we-are-thankful-for</guid>
		<description><![CDATA[Thanksgiving is one of my favorite holidays.  It’s full of good food, good naps, and hopefully good company… with out the stress of gift-giving.  It’s also a great time to be thankful for all of the good things in life – especially the web. This year we would like to share our favorites [...]]]></description>
			<content:encoded><![CDATA[<p>Thanksgiving is one of my favorite holidays.  It’s full of good food, good naps, and hopefully good company… with out the stress of gift-giving.  It’s also a great time to be thankful for all of the good things in life – especially the web. This year we would like to share our favorites with you, and <span class="highlight">we want to invite you to add to our list via comment</span>.</p>
<h1 style="margin-bottom:15px;">Erin H.</h1>
<h3><a href="http://erinfight.com/">ErinFight</a></h3>
<p style="margin-top:3px;">Technically, the site isn’t up yet but I love it anyway.  I’ve never helped to inspire a website before.  More importantly, I can’t wait to start kicking some Erin booty!!!!!11</p>
<h3><a href="http://www.tripadvisor.com/">TripAdvisor</a></h3>
<p style="margin-top:3px;">Oh TripAdvisor, my vacations would surely suck with out you.</p>
<h3><a href="http://www.hulu.com/">Hulu</a></h3>
<p style="margin-top:3px;">I don’t have cable (no, not even basic) so hulu really saves my sanity.</p>
<h3><a title="themes" href="http://mail.google.com">GMail</a></h3>
<p style="margin-top:3px;">I don’t know how anyone can have a bad day with ninjas all over their email.  I giggle every time I see them.</p>
<h1 style="margin-bottom:15px;margin-top:25px;">Erin G.</h1>
<h3><a href="http://yelp.com">Yelp</a></h3>
<p style="margin-top:3px;">Because without it, I would have never found the best ribs in the world, <a href="http://www.yelp.com/biz/smoki-os-saint-louis">Smoki O’s</a> in Saint Louis.</p>
<h3><a href="http://vimeo.com">Vimeo</a></h3>
<p style="margin-top:3px;">Because it looks super nice and it’s super functional and they have lots of good, creative videos and film, not just a bunch of <a href="http://www.youtube.com/watch?v=UFr2YeW4mac">old boys ranting about braces</a></p>
<h3><a href="http://patterntap.com">Patterntap.com</a></h3>
<p style="margin-top:3px;">Because it’s been a really good resource of quality design on the web.</p>
<h3><a href="http://couchsurfing.com">Couchsurfing.com</a></h3>
<p style="margin-top:3px;">Lastly, couchsurfing.com because I like to travel and I like supporting people who travel. I like travelers and think staying with locals is way better than staying at a hotel.</p>
<h1 style="margin-bottom:15px;margin-top:25px;;">Dusty</h1>
<h3><a href="http://reader.google.com">Google Reader</a></h3>
<p style="margin-top:3px;">I’m thankful for Google Reader, because without it, I would spend <span class="caps">ALL</span> my time reading blogs, and with it I only spend about <span class="caps">HALF</span> my time. Thanks Google.</p>
<h3><a href="http://www.freshbooks.com">Freshbooks</a></h3>
<p style="margin-top:3px;">Hands down, the best time tracking and invoicing web app around! Without this, we probably wouldn’t be able to even <em>afford</em> turkey today. Truly the cadillac of web-based invoicing! (I’m not even being paid to say that!)</p>
<h3><a href="http://www.omaha.com">Omaha.com</a></h3>
<p style="margin-top:3px;">Sometimes, when I’m feeling down, I go to Omaha.com and click around a bit. There’s just something about popups, blinking ads, and peel-down-pages that cheers me up!</p>
<h3><a href="http://www.twitter.com">Twitter</a></h3>
<p style="margin-top:3px;">Despite what <a href="http://www.wowt.com/news/headlines/35107984.html"><span class="caps">WOW</span>-T says</a>, we here at <a href="http://twitter.com/brightmix">BrightMix</a> loooOOooOooove Twitter. The people we’ve been able to connect with, a mere 140 characters at a time, have forged some lasting friendships, and we’re definitely thankful for that.</p>
<h1 style="margin-bottom:15px;margin-top:25px;;">Kevin</h1>
<h3><a href="http://aws.amazon.com">Amazon Webservices</a></h3>
<p style="margin-top:3px;">For their cloud computing and mass-storage network, <span class="caps">EC2</span> and S3, not to mention their great services, without which <a href="http://tripleseat.com">our</a> <a href="http://betteromaha.com">web apps</a> would be homeless. Oh, and the Amazon Webservices guys were cool enough to post comments on <a href="http://www.brightmix.com/blog/omaha-rails-presentation-amazon-ec2">Dusty’s cloud computing talk</a> he gave last week.</p>
<h3><a href="http://tinyurl.com/6px6vn">LetMeGoogleThatForYou</a></h3>
<p style="margin-top:3px;">Just when you got tired of browsing the web, a group of guys comes along and build this little gem to make our lives easier.</p>
<h3><a href="http://flickr.com">Flickr</a></h3>
<p style="margin-top:3px;">For the most blingy and cheap, javascripty photo organization and storing application. Me Gusta!</p>
<h3><a href="http://www.campfirenow.com/?source=37s+home">Campfire</a></h3>
<p>Despite the fact that it’s just online chat, it’s just really good… and sometimes addictive. Also, a lot of BrightMix’s conception occurred in Campfire chat, of all places!</p>
<h3><a href="http://rubyonrails.org">Ruby on Rails</a></h3>
<p>Aright, so maybe this isn’t technically an app, but it can build <em>great</em> web apps. Seriously though, best web-based programming framework ever. I will <a href="http://www.youtube.com/watch?v=7O7op0tyrP0">throw down</a> with anyone who disagrees. Bring it!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/web-apps-we-are-thankful-for/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Omaha Rails presentation &#8211; Amazon EC2</title>
		<link>http://www.brightmix.com/blog/omaha-rails-presentation-amazon-ec2/</link>
		<comments>http://www.brightmix.com/blog/omaha-rails-presentation-amazon-ec2/#comments</comments>
		<pubDate>Sun, 23 Nov 2008 21:02:00 +0000</pubDate>
		<dc:creator>Dusty</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.brightmix.com//2008/11/23/omaha-rails-presentation-amazon-ec2</guid>
		<description><![CDATA[The other night I gave a talk to the newly-formed Omaha Ruby on Rails User Group, about our experiences with Amazon Web Services, specifically our experience with running Rails applications on the EC2 platform.
We currently host both of our production web apps with Amazon EC2: Tripleseat and BetterOmaha.com, and really have high hopes and much [...]]]></description>
			<content:encoded><![CDATA[<p>The other night I gave a talk to the newly-formed <a href="http://omaharails.org">Omaha Ruby on Rails User Group</a>, about our experiences with <a href="http://aws.amazon.com">Amazon Web Services</a>, specifically our experience with running Rails applications on the <span class="caps">EC2</span> platform.</p>
<p>We currently host both of our production web apps with Amazon <span class="caps">EC2</span>: <a href="http://www.tripleseat.com">Tripleseat</a> and <a href="http://www.betteromaha.com">BetterOmaha.com</a>, and really have high hopes and much love for cloud computing in general. Though nothing we have requires the dynamic scaling that you can achieve with <span class="caps">EC2</span>, its just a matter of time, and we’re excited for the possibilities.</p>
<p>The talk went really well, and I think the group really was intrigued by the opportunities that <span class="caps">EC2</span> opens. We ended with a pretty good Q&amp;A, which is also capture on the video. Enjoy!</p>
<p><object width="700" height="394" data="http://vimeo.com/moogaloop.swf?clip_id=2311862&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=59a5d1&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=2311862&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=59a5d1&amp;fullscreen=1" /></object></p>
<p>You can also <a href="http://www.slideshare.net/brightmix/omaha-rails-user-group-ec2-presentation-780775?type=powerpoint">view the slides here</a>, or <a href="http://www.brightmix.com/assets/2008/11/23/Omaha_Rails_User_Group_-_EC2.pdf">download the <span class="caps">PDF</span>.</a></p>
<p><object width="425" height="355" data="http://static.slideshare.net/swf/ssplayer2.swf?doc=omaha-rails-user-group-ec2-1227471968197870-9&amp;rel=0&amp;stripped_title=omaha-rails-user-group-ec2-presentation-780775" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=omaha-rails-user-group-ec2-1227471968197870-9&amp;rel=0&amp;stripped_title=omaha-rails-user-group-ec2-presentation-780775" /><param name="allowfullscreen" value="true" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/omaha-rails-presentation-amazon-ec2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>RenderPartial to String in ASP.NET MVC Beta</title>
		<link>http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc/</link>
		<comments>http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc/#comments</comments>
		<pubDate>Sun, 16 Nov 2008 23:16:00 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[asp.net RJS]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://www.brightmix.com//2008/11/24/how-to-renderpartial-to-string-in-asp-net-mvc</guid>
		<description><![CDATA[Update! RenderPartial to String has become much easier in ASP.NET MVC, see the new post here!
We  usually don’t post much about hardcore programming-related things here, but this is an exception to the rule.
We’re primarily a Ruby on Rails shop, but we still do ASP.NET development fairly regularly. Our overall interest in ASP.NET was waning [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Update! RenderPartial to String has become much easier in ASP.NET MVC, <a href="http://www.brightmix.com/blog/renderpartial-to-string-in-asp-net-mvc/">see the new post here!</a></p></blockquote>
<p>We  usually don’t post much about hardcore programming-related things here, but this is an exception to the rule.</p>
<p>We’re primarily a <a href="http://rubyonrails.com/">Ruby on Rails</a> shop, but we still do <span class="caps">ASP</span>.NET development fairly regularly. Our overall interest in <span class="caps">ASP</span>.NET was waning until the new <a href="http://www.asp.net/mvc/"><span class="caps">ASP</span>.NET <span class="caps">MVC</span></a> framework was released. <span class="caps">ASP</span>.NET <span class="caps">MVC</span> brings a number of the concepts we love from Rails into the <span class="caps">ASP</span>.NET arena.</p>
<p>However, <span class="highlight">one limitation we’ve come across with <span class="caps">ASP</span>.NET <span class="caps">MVC</span> is the lack of ability to render a partial to a string</span>. This is really handy if you’re doing Ajax things; it also happens to be one of the things we really love about Rails. Additionally, it’s a feature others have been wanting, too, see <a href="http://ayende.com/Blog/archive/2008/11/11/another-asp.net-mvc-bug-rendering-views-to-different-output-source.aspx">here</a> and <a href="http://stackoverflow.com/questions/286132/aspnet-mvc-getting-a-paritial-views-html-from-inside-of-the-controller">here</a>.</p>
<p>Well, the good news is I have a solution for at least some of you out there. <span class="highlight">I’ve cobbled together a few concepts from various sources and forum posts to make it all happen. Here is how you can render a view into a string.</span></p>
<p>First, you need to include these files in your project, both are from the <a href="http://www.codeplex.com/MVCContrib">MvcContrib project</a>.</p>
<p style="margin-bottom:5px;font-size:15px;;"><a href="http://www.brightmix.com/assets/2008/11/16/BlockRenderer.cs">Download BlockRender.cs</a> – from MvcContrib</p>
<pre class="csharpcode" style="height: 200px; overflow-y: scroll; overflow-x: hidden;"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.IO;
<span class="kwrd">using</span> System.Web;
<span class="kwrd">using</span> System.Collections.Generic;

<span class="kwrd">namespace</span> MvcContrib.UI
{
    <span class="rem">/// &lt;summary&gt;Renders an Action delegate and captures all output to a string. &lt;/summary&gt;</span>
    <span class="kwrd">public</span> <span class="kwrd">class</span> BlockRenderer
    {
        <span class="kwrd">private</span> <span class="kwrd">readonly</span> HttpContextBase _httpContext;

        <span class="kwrd">public</span> BlockRenderer(HttpContextBase httpContext)
        {
            _httpContext = httpContext;
        }

        <span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> HttpResponse
        {
            <span class="kwrd">public</span> <span class="kwrd">bool</span> UsingHttpWriter { get { <span class="kwrd">return</span> <span class="kwrd">true</span>; } }
        }

        <span class="rem">/// &lt;summary&gt;Renders the action and returns a string.&lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="viewRenderer"&gt;The delegate to render.&lt;/param&gt;</span>
        <span class="rem">/// &lt;returns&gt;The rendered text.&lt;/returns&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">string</span> Capture(Action viewRenderer)
        {
            HttpResponseBase resp = _httpContext.Response;
            Stream originalFilter = <span class="kwrd">null</span>;
            CapturingResponseFilter innerFilter;
            <span class="kwrd">string</span> capturedHtml = <span class="str">""</span>;

            <span class="kwrd">if</span> (viewRenderer != <span class="kwrd">null</span>)
            {
                <span class="kwrd">try</span>
                {
                    resp.Flush();
                    originalFilter = resp.Filter;
                    innerFilter = <span class="kwrd">new</span> CapturingResponseFilter(resp.Filter);
                    resp.Filter = innerFilter;
                    viewRenderer();

                    resp.Flush();
                    capturedHtml = innerFilter.GetContents(resp.ContentEncoding);
                }
                <span class="kwrd">finally</span>
                {
                    <span class="kwrd">if</span> (originalFilter != <span class="kwrd">null</span>)
                    {
                        resp.Filter = originalFilter;
                    }
                }
            }
            <span class="kwrd">return</span> capturedHtml;
        }
    }
}</pre>
<p style="margin-bottom:5px;font-size:15px;;"><a href="http://www.brightmix.com/assets/2008/11/16/CapturingResponseFilter.cs">Download CapturingResponseFilter.cs</a> – from MvcContrib</p>
<pre class="csharpcode" style="height: 200px; overflow-y: scroll; overflow-x: hidden;"><span class="kwrd">using</span> System.IO;
<span class="kwrd">using</span> System.Text;

<span class="kwrd">namespace</span> MvcContrib.UI
{
    <span class="kwrd">public</span> <span class="kwrd">class</span> CapturingResponseFilter : Stream
    {
        <span class="kwrd">private</span> Stream _sink;
        <span class="kwrd">private</span> MemoryStream mem;

        <span class="kwrd">public</span> CapturingResponseFilter(Stream sink)
        {
            _sink = sink;
            mem = <span class="kwrd">new</span> MemoryStream();
        }

        <span class="rem">// The following members of Stream must be overriden.</span>
        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">bool</span> CanRead
        {
            get { <span class="kwrd">return</span> <span class="kwrd">true</span>; }
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">bool</span> CanSeek
        {
            get { <span class="kwrd">return</span> <span class="kwrd">false</span>; }
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">bool</span> CanWrite
        {
            get { <span class="kwrd">return</span> <span class="kwrd">false</span>; }
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">long</span> Length
        {
            get { <span class="kwrd">return</span> 0; }
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">long</span> Position { get; set; }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">long</span> Seek(<span class="kwrd">long</span> offset, SeekOrigin direction)
        {
            <span class="kwrd">return</span> 0;
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> SetLength(<span class="kwrd">long</span> length)
        {
            _sink.SetLength(length);
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Close()
        {
            _sink.Close();
            mem.Close();
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Flush()
        {
            _sink.Flush();
        }

        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">int</span> Read(<span class="kwrd">byte</span>[] buffer, <span class="kwrd">int</span> offset, <span class="kwrd">int</span> count)
        {
            <span class="kwrd">return</span> _sink.Read(buffer, offset, count);
        }

        <span class="rem">// Override the Write method to filter Response to a file. </span>
        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> Write(<span class="kwrd">byte</span>[] buffer, <span class="kwrd">int</span> offset, <span class="kwrd">int</span> count)
        {
            <span class="rem">//Here we will not write to the sink b/c we want to capture</span>

            <span class="rem">//Write out the response to the file.</span>
            mem.Write(buffer, 0, count);
        }

        <span class="kwrd">public</span> <span class="kwrd">string</span> GetContents(Encoding enc)
        {
            var buffer = <span class="kwrd">new</span> <span class="kwrd">byte</span>[mem.Length];
            mem.Position = 0;
            mem.Read(buffer, 0, buffer.Length);
            <span class="kwrd">return</span> enc.GetString(buffer, 0, buffer.Length);

        }
    }
}</pre>
<hr />
<p>With the above two files included in your project, you’re almost ready to go. Now you just need to include a method that makes all the magic happen (more easily). <span class="highlight">As seen in the example below, define the RenderPartialToString() and then call it from your controller:</span></p>
<pre class="csharpcode" style="overflow-x:scroll"><span class="rem">/// Static Method to render string - put somewhere of your choosing</span>
<span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">string</span> RenderPartialToString(<span class="kwrd">string</span> userControl, <span class="kwrd">object</span> viewData, ControllerContext controllerContext)
{
    HtmlHelper h = <span class="kwrd">new</span> HtmlHelper(<span class="kwrd">new</span> ViewContext(controllerContext, <span class="kwrd">new</span> WebFormView(<span class="str">"omg"</span>), <span class="kwrd">null</span>, <span class="kwrd">null</span>), <span class="kwrd">new</span> ViewPage());
    var blockRenderer = <span class="kwrd">new</span> BlockRenderer(controllerContext.HttpContext);

    <span class="kwrd">string</span> s = blockRenderer.Capture(
        () =&gt; RenderPartialExtensions.RenderPartial(h, userControl, viewData)
    );

    <span class="kwrd">return</span> s;
}

<span class="rem">/// Your Controller method...  </span>
<span class="kwrd">public</span> ActionResult MakeStringForMe()
{
    var objectViewData = <span class="kwrd">new</span> objectViewData { SomeString = <span class="str">"Dude"</span>, SomeNumber = 1 };

    <span class="kwrd">string</span> s = RenderPartialToString(<span class="str">"~/Views/Controls/UserControl.ascx"</span>, objectViewData, <span class="kwrd">this</span>.ControllerContext);

    View();
}</pre>
<p>With a little bit of luck and good fortune, it should work and you’ll be rendering partials to strings like a machine!</p>
<h3>How It All Works</h3>
<p>Basically, it’s using the Response object to render a usercontrol and capture the output into a string. Then, it filters that rendered content out of the response with some fancy trickery. All in all, <span class="highlight">it’s definitely a hack, but it gets the job done</span>—at least until the Microsoft team can address this issue at its core (hint hint).</p>
<h3>A Few Limitiations and/or Questions</h3>
<p>I read somewhere that this might not work if you need to retrieve things out of the session. I have not verified this.</p>
<p>Additionally, I have no idea what effects using this approach will have on the large-scale performance of an app. It hasn’t caused any problems for the application I’m using it on.</p>
<p>Lastly, you cannot specify the ContentType on the response. If you do, you’ll get an exception:</p>
<blockquote><p>Server cannot set content type after <span class="caps">HTTP</span> headers have been sent</p></blockquote>
<p>This seems to be a limitation that results from rendering a usercontrol. This will be problematic if you want your controller to return data with a ContenType of, say, “text/javascript.” I ran into this problem while building a Rails-like <span class="caps">RJS</span> framework (see below), but managed to deal with it fairly elegantly.</p>
<h2>Rails-like <span class="caps">RJS</span> for <span class="caps">ASP</span>.NET <span class="caps">MVC</span></h2>
<p>In line with the ability to RenderPartial to string, <span class="highlight">I’ve also put together a Rails-like <span class="caps">RJS</span> framework for <span class="caps">ASP</span>.NET <span class="caps">MVC</span></span>. Simply put, <span class="caps">RJS</span> is a framework that renders and builds dynamic javascript on the server. Similar to Rails’ <span class="caps">RJS</span>, it’s specific to the <a href="http://www.prototypejs.org">Prototype framework</a> – sorry JQuery guys (for what it’s worth, it could probably be easily ported to JQuery!).</p>
<p>Here’s a quick snippet of what this allows you to do from your Controller:</p>
<pre class="csharpcode" style="overflow-x:scroll"><span class="rem">// Example Usage in your Controller:</span>
<span class="kwrd">public</span> ActionResult HideElement(<span class="kwrd">string</span> elementId)
{
    RjsResult r = <span class="kwrd">new</span> RjsResult();
    r.Effect(elementId, RjsResult.EffectTypes.Hide);

    <span class="kwrd">return</span> r;
}

<span class="rem">// A more complicated but powerful example of returning the contents of two UserControls and inserting them into two different &lt;div&gt;'s</span>
<span class="kwrd">public</span> ActionResult InsertUserControl()
{
    ObjectViewData viewData = <span class="kwrd">new</span> ObjectViewData { SomeString = <span class="str">"dude"</span>, SomeNumber = 1 };

    var r = <span class="kwrd">new</span> RjsResult();
    r.Insert(<span class="str">"div_one"</span>, RjsResult.Positions.Top, <span class="str">"~/Views/Controls/UserControl1.ascx"</span>, ObjectViewData, ControllerContext);
    r.Insert(<span class="str">"div_two"</span>, RjsResult.Positions.Bottom, <span class="str">"~/Views/Controls/UserControl2.ascx"</span>, ObjectViewData, ControllerContext);

    <span class="kwrd">return</span> r;
}</pre>
<p>In both of the above examples, I’m calling a few different methods on the RjsResult object. Behind the scenes, the RjsResult object is building up a string of javascript commands that make all the magic happen in the user’s browser. If you’re still confused, I suggest you read <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper/JavaScriptGenerator/GeneratorMethods.html">this page</a> from the Rails documentation, which might explain the concept better.</p>
<p>With that said, here is the code for my <span class="caps">ASP</span>.NET <span class="caps">MVC RJS</span> framework!</p>
<p style="margin-bottom:5px;font-size:15px;;"><a href="http://www.brightmix.com/assets/2008/11/16/RjsResult.cs">Download RjsResult.cs</a></p>
<pre class="csharpcode" style="height: 200px; overflow-y: scroll; overflow-x: hidden;"><span class="kwrd">namespace</span> System.Web.Mvc
{
    <span class="kwrd">using</span> System;
    <span class="kwrd">using</span> System.Text;
    <span class="kwrd">using</span> System.Web;
    <span class="kwrd">using</span> System.Collections.Generic;
    <span class="kwrd">using</span> System.Security.Policy;
    <span class="kwrd">using</span> System.Web.Script.Serialization;
    <span class="kwrd">using</span> MvcContrib.UI;
    <span class="kwrd">using</span> System.Web.Mvc.Html;

    [AspNetHostingPermission(System.Security.Permissions.SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    [AspNetHostingPermission(System.Security.Permissions.SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
    <span class="kwrd">public</span> <span class="kwrd">class</span> RjsResult : ActionResult
    {
        <span class="preproc">#region</span> Constructors
        <span class="kwrd">public</span> RjsResult(<span class="kwrd">bool</span> setContentType)
        {
            Actions = <span class="kwrd">new</span> List&lt;IRjsActionBase&gt;();
            <span class="kwrd">this</span>.SetContentType = setContentType;
        }

        <span class="kwrd">public</span> RjsResult() : <span class="kwrd">this</span>(<span class="kwrd">false</span>)
        {
        }
        <span class="preproc">#endregion</span>

        <span class="preproc">#region</span> Private Vars
        <span class="kwrd">private</span> <span class="kwrd">bool</span> SetContentType { get; set; }

        <span class="kwrd">private</span> List&lt;IRjsActionBase&gt; Actions
        {
            get;
            set;
        }

        <span class="preproc">#endregion</span>

        <span class="preproc">#region</span> Rjs Actions
        <span class="kwrd">public</span> <span class="kwrd">interface</span> IRjsActionBase
        {
            <span class="kwrd">string</span> Render();
        }

        <span class="kwrd">private</span> <span class="kwrd">class</span> RjsUpdateAction : IRjsActionBase
        {
            <span class="kwrd">public</span> RjsUpdateAction(<span class="kwrd">string</span> element, <span class="kwrd">string</span> contents)
            {
                <span class="kwrd">this</span>.element = element;
                <span class="kwrd">this</span>.contents = contents;
            }

            <span class="kwrd">public</span> <span class="kwrd">string</span> element { get; set; }
            <span class="kwrd">public</span> <span class="kwrd">string</span> contents { get; set; }

            <span class="preproc">#region</span> IRjsActionBase Members

            <span class="kwrd">public</span> <span class="kwrd">string</span> Render()
            {
                <span class="kwrd">if</span> (!contents.StartsWith(<span class="str">"\""</span>))
                    contents = <span class="str">"\""</span> + contents + <span class="str">"\""</span>;

                <span class="kwrd">return</span> <span class="kwrd">string</span>.Format(<span class="str">"Element.update(\"{0}\", {1});"</span>, element, contents);
            }

            <span class="preproc">#endregion</span>
        }

        <span class="kwrd">private</span> <span class="kwrd">class</span> RjsInsertAction : IRjsActionBase
        {
            <span class="kwrd">public</span> RjsInsertAction(<span class="kwrd">string</span> element, Positions p, <span class="kwrd">string</span> contents)
            {
                <span class="kwrd">this</span>.element = element;
                <span class="kwrd">this</span>.contents = contents;
                <span class="kwrd">this</span>.position = p;
            }

            <span class="kwrd">public</span> <span class="kwrd">string</span> element { get; set; }
            <span class="kwrd">public</span> <span class="kwrd">string</span> contents { get; set; }
            <span class="kwrd">public</span> Positions position { get; set; }

            <span class="preproc">#region</span> IRjsActionBase Members

            <span class="kwrd">public</span> <span class="kwrd">string</span> Render()
            {
                <span class="kwrd">if</span> (!contents.StartsWith(<span class="str">"\""</span>))
                    contents = <span class="str">"\""</span> + contents + <span class="str">"\""</span>;

                <span class="kwrd">return</span> <span class="kwrd">string</span>.Format(<span class="str">"Element.insert(\"{0}\", {{{1}: {2} }});"</span>, element, position, contents);
            }

            <span class="preproc">#endregion</span>
        }

        <span class="kwrd">private</span> <span class="kwrd">class</span> RjsStringAction : IRjsActionBase
        {
            <span class="kwrd">public</span> <span class="kwrd">string</span> contents { get; set; }

            <span class="kwrd">public</span> RjsStringAction(<span class="kwrd">string</span> contents)
            {
                <span class="kwrd">this</span>.contents = contents;
            }

            <span class="preproc">#region</span> IRjsActionBase Members

            <span class="kwrd">public</span> <span class="kwrd">string</span> Render()
            {
                <span class="kwrd">return</span> <span class="kwrd">this</span>.contents;
            }

            <span class="preproc">#endregion</span>
        }

        <span class="kwrd">private</span> <span class="kwrd">class</span> RjsShowAction : IRjsActionBase
        {
            <span class="kwrd">public</span> RjsShowAction(<span class="kwrd">string</span> element)
            {
                <span class="kwrd">this</span>.element = element;
            }
            <span class="kwrd">public</span> <span class="kwrd">string</span> element { get; set; }

            <span class="preproc">#region</span> IRjsActionBase Members

            <span class="kwrd">public</span> <span class="kwrd">string</span> Render()
            {
                <span class="kwrd">return</span> <span class="kwrd">string</span>.Format(<span class="str">"$(\"{0}\").show();"</span>, element);
            }

            <span class="preproc">#endregion</span>
        }

        <span class="kwrd">private</span> <span class="kwrd">class</span> RjsAlertAction : IRjsActionBase
        {
            <span class="kwrd">public</span> RjsAlertAction(<span class="kwrd">string</span> message)
            {
                <span class="kwrd">this</span>.message = message;
            }
            <span class="kwrd">public</span> <span class="kwrd">string</span> message { get; set; }

            <span class="preproc">#region</span> IRjsActionBase Members

            <span class="kwrd">public</span> <span class="kwrd">string</span> Render()
            {
                <span class="kwrd">return</span> <span class="kwrd">string</span>.Format(<span class="str">"alert('{0}');"</span>, message);
            }

            <span class="preproc">#endregion</span>
        }

        <span class="kwrd">private</span> <span class="kwrd">class</span> RjsHideAction : IRjsActionBase
        {
            <span class="kwrd">public</span> RjsHideAction(<span class="kwrd">string</span> element)
            {
                <span class="kwrd">this</span>.element = element;
            }
            <span class="kwrd">public</span> <span class="kwrd">string</span> element { get; set; }

            <span class="preproc">#region</span> IRjsActionBase Members

            <span class="kwrd">public</span> <span class="kwrd">string</span> Render()
            {
                <span class="kwrd">return</span> <span class="kwrd">string</span>.Format(<span class="str">"$(\"{0}\").hide();"</span>, element);
            }

            <span class="preproc">#endregion</span>
        }

        <span class="kwrd">private</span> <span class="kwrd">class</span> RjsRemoveAction : IRjsActionBase
        {
            <span class="kwrd">public</span> RjsRemoveAction(<span class="kwrd">string</span> element)
            {
                <span class="kwrd">this</span>.element = element;
            }
            <span class="kwrd">public</span> <span class="kwrd">string</span> element { get; set; }

            <span class="preproc">#region</span> IRjsActionBase Members

            <span class="kwrd">public</span> <span class="kwrd">string</span> Render()
            {
                <span class="kwrd">return</span> <span class="kwrd">string</span>.Format(<span class="str">"$(\"{0}\").remove();"</span>, element);
            }

            <span class="preproc">#endregion</span>
        }

        <span class="kwrd">private</span> <span class="kwrd">class</span> RjsEffectAction : IRjsActionBase
        {
            <span class="kwrd">public</span> RjsEffectAction(<span class="kwrd">string</span> element, EffectTypes effect, KeyValuePair&lt;<span class="kwrd">string</span>, <span class="kwrd">string</span>&gt;[] options)
            {
                <span class="kwrd">this</span>.options = <span class="kwrd">new</span> Dictionary&lt;<span class="kwrd">string</span>, <span class="kwrd">string</span>&gt;();

                <span class="kwrd">if</span> (options != <span class="kwrd">null</span>)
                {
                    <span class="kwrd">foreach</span> (KeyValuePair&lt;<span class="kwrd">string</span>, <span class="kwrd">string</span>&gt; pair <span class="kwrd">in</span> options)
                        <span class="kwrd">this</span>.options.Add(pair.Key, pair.Value);
                }

                <span class="kwrd">this</span>.element = element;
                <span class="kwrd">this</span>.effect = effect;
            }

            <span class="kwrd">public</span> <span class="kwrd">string</span> element { get; set; }
            <span class="kwrd">public</span> EffectTypes effect { get; set; }
            <span class="kwrd">public</span> Dictionary&lt;<span class="kwrd">string</span>, <span class="kwrd">string</span>&gt; options { get; set; }

            <span class="preproc">#region</span> IRjsActionBase Members

            <span class="kwrd">public</span> <span class="kwrd">string</span> Render()
            {
                <span class="kwrd">string</span> ret = <span class="kwrd">string</span>.Format(<span class="str">"new Effect.{0}(\"{1}\""</span>, effect.ToString(), element);
                ret += <span class="str">", {"</span>;

                <span class="kwrd">foreach</span> (<span class="kwrd">string</span> key <span class="kwrd">in</span> options.Keys)
                {
                    ret += <span class="kwrd">string</span>.Format(<span class="str">"{0}: {1}"</span>, key, options[key]);
                }
                ret += <span class="str">"});"</span>;

                <span class="kwrd">return</span> ret;
            }

            <span class="preproc">#endregion</span>
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Call me from your controller and pass me your ControllerContext and I'll render a UserControl for you and return the contents as a string!</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="userControl"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="viewData"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="controllerContext"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;returns&gt;&lt;/returns&gt;</span>
        <span class="kwrd">private</span> <span class="kwrd">string</span> RenderPartialToString(<span class="kwrd">string</span> userControl, <span class="kwrd">object</span> viewData, ControllerContext controllerContext)
        {
            HtmlHelper h = <span class="kwrd">new</span> HtmlHelper(<span class="kwrd">new</span> ViewContext(controllerContext, <span class="kwrd">new</span> WebFormView(<span class="str">"omg"</span>), <span class="kwrd">null</span>, <span class="kwrd">null</span>), <span class="kwrd">new</span> ViewPage());
            var blockRenderer = <span class="kwrd">new</span> BlockRenderer(controllerContext.HttpContext);

            var r = <span class="kwrd">new</span> RjsResult();
            JavaScriptSerializer serializer = <span class="kwrd">new</span> JavaScriptSerializer();
            <span class="kwrd">string</span> s = blockRenderer.Capture(
                () =&gt; RenderPartialExtensions.RenderPartial(h, userControl, viewData)
            );

            <span class="kwrd">return</span> serializer.Serialize(s);
        }
        <span class="preproc">#endregion</span>

        <span class="preproc">#region</span> Fun Enums
        <span class="kwrd">public</span> <span class="kwrd">enum</span> Positions
        {
            Before = 1,
            After,
            Top,
            Bottom
        }

        <span class="kwrd">public</span> <span class="kwrd">enum</span> EffectTypes
        {
            Appear = 1,
            Fade,
            SlideDown,
            SlideUp,
            Shake,
            Highlight
        }
        <span class="preproc">#endregion</span>

        <span class="preproc">#region</span> Rjs Methods
        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Renders a user control and inserts the contents into specified element</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="element"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="p"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="userControl"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="viewData"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="controllerContext"&gt;&lt;/param&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">void</span> Insert(<span class="kwrd">string</span> element, Positions p, <span class="kwrd">string</span> userControl, <span class="kwrd">object</span> viewData, ControllerContext controllerContext)
        {
            Insert(element, p, RenderPartialToString(userControl, viewData, controllerContext) );
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Inserts content into specific element</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="element"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="p"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="contents"&gt;&lt;/param&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">void</span> Insert(<span class="kwrd">string</span> element, Positions p, <span class="kwrd">string</span> contents)
        {
            Actions.Add(<span class="kwrd">new</span> RjsInsertAction(element, p, contents));
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Update a part of the page by rendering a user control</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="element"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="userControl"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="viewData"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="controllerContext"&gt;&lt;/param&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">void</span> Update(<span class="kwrd">string</span> element, <span class="kwrd">string</span> userControl, <span class="kwrd">object</span> viewData, ControllerContext controllerContext)
        {
            Update(element, RenderPartialToString(userControl, viewData, controllerContext));
        }

        <span class="kwrd">public</span> <span class="kwrd">void</span> Update(<span class="kwrd">string</span> element, <span class="kwrd">string</span> contents)
        {
            Actions.Add(<span class="kwrd">new</span> RjsUpdateAction(element, contents));
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Alert some text</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="message"&gt;&lt;/param&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">void</span> Alert(<span class="kwrd">string</span> message)
        {
            Actions.Add(<span class="kwrd">new</span> RjsAlertAction(message));
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Render some javascript code.. whatever you want</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="contents"&gt;&lt;/param&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">void</span> RenderString(<span class="kwrd">string</span> contents)
        {
            Actions.Add(<span class="kwrd">new</span> RjsStringAction(contents));
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Shows an element</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="element"&gt;&lt;/param&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">void</span> Show(<span class="kwrd">string</span> element)
        {
            Actions.Add(<span class="kwrd">new</span> RjsShowAction(element));
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Hides an element</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="element"&gt;&lt;/param&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">void</span> Hide(<span class="kwrd">string</span> element)
        {
            Actions.Add(<span class="kwrd">new</span> RjsHideAction(element));
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Delets an element</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="element"&gt;&lt;/param&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">void</span> Remove(<span class="kwrd">string</span> element)
        {
            Actions.Add(<span class="kwrd">new</span> RjsHideAction(element));
        }

        <span class="rem">/// &lt;summary&gt;</span>
        <span class="rem">/// Calls an effect of type EffectTypes, also takes array of prototype options</span>
        <span class="rem">/// &lt;/summary&gt;</span>
        <span class="rem">/// &lt;param name="element"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="effect"&gt;&lt;/param&gt;</span>
        <span class="rem">/// &lt;param name="options"&gt;&lt;/param&gt;</span>
        <span class="kwrd">public</span> <span class="kwrd">void</span> Effect(<span class="kwrd">string</span> element, EffectTypes effect, KeyValuePair&lt;<span class="kwrd">string</span>, <span class="kwrd">string</span>&gt;[] options)
        {
            Actions.Add(<span class="kwrd">new</span> RjsEffectAction(element, effect, options));
        }
        <span class="kwrd">public</span> <span class="kwrd">void</span> Effect(<span class="kwrd">string</span> element, EffectTypes effect)
        {
            Actions.Add(<span class="kwrd">new</span> RjsEffectAction(element, effect, <span class="kwrd">null</span>));
        }

        <span class="preproc">#endregion</span>

        <span class="preproc">#region</span> ActionResult Override
        <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> ExecuteResult(ControllerContext context)
        {
            <span class="kwrd">if</span> (context == <span class="kwrd">null</span>)
            {
                <span class="kwrd">throw</span> <span class="kwrd">new</span> ArgumentNullException(<span class="str">"context"</span>);
            }

            HttpResponseBase response = context.HttpContext.Response;

            <span class="kwrd">if</span> (<span class="kwrd">this</span>.SetContentType)
                response.ContentType = <span class="str">"application/javascript"</span>;

            <span class="kwrd">string</span> result = <span class="kwrd">string</span>.Empty;

            <span class="kwrd">foreach</span> (IRjsActionBase action <span class="kwrd">in</span> Actions)
            {
                result += action.Render();
            }

            response.Write(result);
        }
<span class="preproc">#endregion</span>
    }
}</pre>
<h3 style="margin-top:15px;">One Major Gotcha</h3>
<p>A trick to getting this to work with Prototype’s <a href="http://www.prototypejs.org/api/ajax/request">Ajax.Request</a> is the ContentType of the returned data needs to be of type “text/javascript” in order for it to automatically be evaluated as javascript. However, you can get around this by forcing Prototype to evaluate the response data as javascript via the <a href="http://www.prototypejs.org/api/ajax/options">EvalJS: ‘force’</a> parameter.</p>
<p>So that’s it. A working way to RenderPartial to a string on the server-side and also the startings of a Rails-like <span class="caps">RJS</span> framework for <span class="caps">ASP</span>.NET <span class="caps">MVC</span>!</p>
<p><span class="highlight">Thoughts, comments, patches or otherwise are appreciated!</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/how-to-renderpartial-to-string-in-asp-net-mvc/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>BrightMix featured in Midlands Business Journal</title>
		<link>http://www.brightmix.com/blog/brightmix-featured-in-midlands-business-journal/</link>
		<comments>http://www.brightmix.com/blog/brightmix-featured-in-midlands-business-journal/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 20:29:00 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[About]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[awesome]]></category>
		<category><![CDATA[midlands business journal]]></category>

		<guid isPermaLink="false">http://www.brightmix.com//2008/11/07/brightmix-featured-in-midlands-business-journal</guid>
		<description><![CDATA[Yet again, BrightMix has somehow found its way into the news. We were interviewed by the Midlands Business Journal about our company, how we started, etc. We’re real pleased with the article and how it turned out!

Unfortunately the Midlands Business Journal doesn’t have an online presence for their articles or we’d link to it. If [...]]]></description>
			<content:encoded><![CDATA[<p>Yet again, BrightMix has somehow found its way into the news. We were interviewed by the <a href="http://www.mbj.com/">Midlands Business Journal</a> about our company, how we started, etc. We’re real pleased with the article and how it turned out!</p>
<p><a href="http://www.brightmix.com/assets/2008/11/7/mbl_large.jpg"><img src="http://www.brightmix.com/assets/2008/11/7/mbl.jpg" alt="" /></a></p>
<p>Unfortunately the Midlands Business Journal doesn’t have an online presence for their articles or we’d link to it. If only there was someway to get them to put their content online (hint hint) <img src='http://www.brightmix.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/brightmix-featured-in-midlands-business-journal/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Making a Great PowerPoint Presentation Better</title>
		<link>http://www.brightmix.com/blog/making-a-great-powerpoint-presentation/</link>
		<comments>http://www.brightmix.com/blog/making-a-great-powerpoint-presentation/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 06:07:00 +0000</pubDate>
		<dc:creator>Kevin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[powerpoint]]></category>

		<guid isPermaLink="false">http://www.brightmix.com//2008/11/07/making-a-great-powerpoint-presentation</guid>
		<description><![CDATA[It’s easy to make a PowerPoint presentation.. but way more difficult to make a great one. What classifies as a great Slideshow deck? I’d like to say most people get it, but many don’t. Here’s some advise from the pros:
Jeff Atwood says keeping it simple is the paramount to keeping your audience interested. No creating [...]]]></description>
			<content:encoded><![CDATA[<p>It’s easy to make a PowerPoint presentation.. but way more difficult to make a great one. What classifies as a great Slideshow deck? I’d like to say most people get it, but many don’t. Here’s some advise from the pros:</p>
<p><a href="http://codinghorror.com">Jeff Atwood</a> says <a href="http://www.codinghorror.com/blog/archives/000512.html">keeping it simple</a> is the paramount to keeping your audience interested. No creating small diatribes or small novels inside your slides.</p>
<p>Seth Godin says to <a href="http://sethgodin.typepad.com/seths_blog/2007/01/really_bad_powe.html">make an emotional connection with your audience</a> through the use of images, simplicity, oh, and not bombarding your listeners with bulleted lists of factoids.</p>
<blockquote><p>Communication is about getting others to adopt your point of view, to help them understand why you’re excited (or sad, or optimistic or whatever else you are.)If all you want to do is create a file of facts and figures, then cancel the meeting and send in a report.</p></blockquote>
<p>There are countless resources on <a href="http://www.davidairey.com/how-not-to-use-powerpoint/">how not to use PowerPoint</a>.</p>
<p>If you’re on board with my last few points, you rock and you’re the best – but <span class="highlight">how can you make an even <em>better</em> slideshow. Where’s that next edge?</span></p>
<h2>Our Newest Concept: Graphic Design + Slides</h2>
<p>Last week Dusty gave a presentation at <a href="http://highlightmidwest.org/?page_id=11">Highlight Midwest</a> with <a href="http://nimblelogic.com">Matt</a> and <a href="http://siliconprairienews.com">Jeff</a> about the cool startup/entrepreneurial activity that’s going down in Omaha. In preparation for their talk, they put together a pretty sweet slide deck. However, it was lacking some serious visual pizazz. What did we do?</p>
<p>If you didn’t already know, <span class="highlight">we value design, <em>look and feel</em>, and usability heavily in the <a href="http://tripleseat.com">web</a> <a href="http://betteromaha.com">applications</a> <a href="http://fsmomaha.com">we</a> <a href="http://siliconprairienews.com">build</a></span>. So we thought… maybe apply these same concepts to a slideshow?</p>
<p>Seemed like something worth trying, so we handed it off to Erin #2 to see what she could do. After a few hours, it was pretty apparent that it was time well spent. The before and after results are below.</p>
<div style="margin: 0pt auto; width: 425px;">
<div style="text-align:center"><strong>Original</strong></div>
<div style="width: 425px; text-align: left; margin-bottom: 25px;"><object width="425" height="355" data="http://static.slideshare.net/swf/ssplayer2.swf?doc=omahahighlightoriginal-1225910378967319-9&amp;stripped_title=highlight-midwest-omaha-presentation" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=omahahighlightoriginal-1225910378967319-9&amp;stripped_title=highlight-midwest-omaha-presentation" /><param name="allowfullscreen" value="true" /></object></div>
<div style="text-align:center"><strong>Designed (Erinified)</strong></div>
<div style="width: 425px; text-align: left; margin-bottom: 25px;"><object width="425" height="355" data="http://static.slideshare.net/swf/ssplayer2.swf?doc=omahahighlight-1225905370711174-9&amp;stripped_title=omaha-highlight-midwest-designed-presentation" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=omahahighlight-1225905370711174-9&amp;stripped_title=omaha-highlight-midwest-designed-presentation" /><param name="allowfullscreen" value="true" /></object></div>
</div>
<h2>End Result: Get a Designer to Take Your Presentation to the Next Level</h2>
<p>Of course, hardcore graphic design doesn’t come cheap or free (usually). We hired an <a href="http://tinyxl.com">awesome designer</a> for that reason, but there are other avenues to take if you’re seriously looking.</p>
<p>In fact, we contracted out to <a href="http://apolloideas.com/apollo/portfolio.html">this designer</a>, who specializes in gussying up slideshows, to create a presentation for our Tripleseat product. It was money well spent!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/making-a-great-powerpoint-presentation/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tripleseat featured in Restaurant Magazine</title>
		<link>http://www.brightmix.com/blog/tripleseat-featured-in-restaurant-magazine/</link>
		<comments>http://www.brightmix.com/blog/tripleseat-featured-in-restaurant-magazine/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 02:25:00 +0000</pubDate>
		<dc:creator>Dusty</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.brightmix.com//2008/11/04/tripleseat-featured-in-restaurant-magazine</guid>
		<description><![CDATA[We’re always excited when we get a little press coverage, so we were quite stoked to see that Tripleseat was featured in this month’s issue of Restaurant Business Magazine. The article was titled The Online Office, and spoke about different ways restaurants are using the internet, and web-based software, to help them save money and [...]]]></description>
			<content:encoded><![CDATA[<p>We’re always excited when we get a little press coverage, so we were quite stoked to see that <a href="http://www.tripleseat.com">Tripleseat</a> was featured in this month’s issue of <em><a href="http://www.monkeydish.com/">Restaurant Business Magazine</a></em>. The article was titled <em>The Online Office</em>, and spoke about different ways restaurants are using the internet, and web-based software, to help them save money and be more efficient. Very cool stuff, and we’re very excited to have <a href="http://www.tripleseat.com">Tripleseat</a> featured.</p>
<hr />
<h2>The Frog and the Peach</h2>
<p>Contemporary American cuisine restaurant <em><a href="http://www.frogandpeach.com/">The Frog and the Peach</a></em> in New Jersey is a fine dining restaurant with one location, multiple dining rooms and a lot of special events to manage. Event planner Kara Stout is also responsible for updating the restaurant’s Web site. She ends up accessing their Web tools from home and when away on vacation, as well as from the restaurant itself. “Web-based tools save the restaurant money in the end as far as not losing things as much, but more imporantly it earns us more. We are more accessible because of what we have on the Web,” says Stout.</p>
<h3>Booking and planning events on your laptop</h3>
<p>Tripleseat is a startup that provides Web-based customer relationship management and event planning software designed specifically for restaurants. <em><a href="http://www.frogandpeach.com">The Frog and The Peach</a></em> has been involved with the system since it first came out in beta form earlier in 2008. Tripleseat handles event scheduling, follow-up reminders, email alerts and banquet ordering. “When myself or any of the other managers take a lead, we go into the We site. It’s easy to follow up, we don’t waste paper and they don’t have to read my handwriting,” says Stout. Customer information is maintained on the Web site to ease the process for future events and provide leads for potential business.</p>
<p><a href="http://www.brightmix.com/assets/2008/11/4/scan0001.jpg"><img class="flickr_img" src="http://www.brightmix.com/assets/2008/11/4/scan0001_small.jpg" alt="" /></a></p>
<p><a href="http://www.brightmix.com/assets/2008/11/4/scan0002.jpg"><img class="flickr_img" src="http://www.brightmix.com/assets/2008/11/4/scan0002_small.jpg" alt="" /></a></p>
<p><a href="http://www.brightmix.com/assets/2008/11/4/scan0003.jpg"><img class="flickr_img" src="http://www.brightmix.com/assets/2008/11/4/scan0003_small.jpg" alt="" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/tripleseat-featured-in-restaurant-magazine/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Halloween Happy Hour</title>
		<link>http://www.brightmix.com/blog/halloween-happy-hour/</link>
		<comments>http://www.brightmix.com/blog/halloween-happy-hour/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 20:20:00 +0000</pubDate>
		<dc:creator>erin</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[Holidays]]></category>

		<guid isPermaLink="false">http://www.brightmix.com//2008/10/28/halloween-happy-hour</guid>
		<description><![CDATA[
It’s no secret that we at BrightMix love holidays.  Unfortunately, we’ve been so busy with work lately that we’ve let the last few fall through the cracks (sorry about that Columbus).
The good news is we’re turning over a new leaf, starting with Halloween!  We’ll be hosting a “Halloween Happy Hour”, this Friday from [...]]]></description>
			<content:encoded><![CDATA[<p><img class="flickr_img" src="http://www.brightmix.com/assets/2008/10/28/pumpkin.png" alt="" /></p>
<p>It’s no secret that we at BrightMix love <a href="http://www.brightmix.com/blog/cinco-de-brightmix">holidays</a>.  Unfortunately, we’ve been so busy with work lately that we’ve let the last few fall through the cracks (sorry about that Columbus).</p>
<p>The good news is we’re turning over a new leaf, starting with Halloween!  We’ll be hosting a <em><strong>“Halloween Happy Hour”</strong></em>, this <strong>Friday</strong> from <span class="highlight"><strong>4:00 – 6:00pm</strong></span> here at BrightMix.  All are welcome, so we do hope you will join us for a drink (or some Jello shots?)—courtesy of BrightMix!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brightmix.com/blog/halloween-happy-hour/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
