views:

616

answers:

3

When you use Html.RenderPartial is takes the name of the view you want to render, and renders it's content in that place.

I would like to implement something similar. I would like it to take the name of the view you want to render, along with some other variables, and render the content within a container..

For example:

public static class WindowHelper
{
    public static string Window(this HtmlHelper helper, string name, string viewName)
    {
        var sb = new StringBuilder();

        sb.Append("<div id='" + name + "_Window' class='window'>");
        //Add the contents of the partial view to the string builder.
        sb.Append("</div>");

        return sb.ToString();
    }
}

Anyone know how to do this?

A: 

Why not create a second view and have the partial inside that, pass Name as ViewData or in model etc..

Something like:

<div id='<%= ViewData["Name"] + "_Window"%>' class='window'>
   <% Html.RenderPartial(ViewData["Name"]); %>
</div>

Hope that helps, Dan

Daniel Elliott
+5  A: 

The RenderPartial extensions are programmed to render directly to the Response object... you can see this in the source code for them:

....).Render(viewContext, this.ViewContext.HttpContext.Response.Output);

This means that if you change your approach a little bit, you can probably accomplish what you want. Rather than appending everything to a StringBuilder, you could do something like this:

using System.Web.Mvc.Html;

public static class WindowHelper
{
    public static void Window(this HtmlHelper helper, string name, string viewName)
    {
        var response = helper.ViewContext.HttpContext.Response;
        response.Write("<div id='" + name + "_Window' class='window'>");

        //Add the contents of the partial view to the string builder.
        helper.RenderPartial(viewName);

        response.Write("</div>");
    }
}

Note that including System.Web.Mvc.Html allows you access to the RenderPartial() methods.

womp
+5  A: 

We are fixing this in MVC 2. You will be able to call Html.Partial() and get the actual contents of the view as a string.

Brad Wilson
Nice. -
womp