views:

625

answers:

1

Hello, I was wondering what, if it is possible, is the best way to render a partial using the new razor view engine. I understand this is something that wasn't finished completely by the time

Right now I am using RenderPage to render the user control:

@RenderPage("~/Views/Shared/LocaleUserControl.cshtml",ViewData.Model)

The page calling RenderPage uses a layout (master) page with three sections defined: TitleContent, HeadContent and Maincontent. When I attempt to render my locale control from this page it appears that these sections are also required - they should only be required in the calling page and are present. I receive the following message, regardless of whether or not I include the sections in my partial view (obviously I dont want to include these sections but it seemed like an interesting debugging point...).

The following sections have been defined but have not been rendered on the layout page '~/Views/Shared/LocaleUserControl.cshtml': TitleContent; HeadContent; MainContent

My partial view is as follows (adapted from the following link):

@inherits System.Web.Mvc.WebViewPage<LocaleBaseModel>
@using System.Web.UI;

<p>
     @Html.LabelFor(model => Model.CountryName)
    <br />
    @Html.DropDownListFor(model => Model.CountryName,null, string.Empty, new { @class = "text", accesskey="u"})
</p>
<p>
     @Html.LabelFor(model => Model.StateProvince)
    <br />
     @Html.DropDownListFor(model => Model.StateProvince, null, string.Empty, new { @class = "text", accesskey="t" })
</p>


<script type="text/javascript">
    $(function () {
        var countries = $("#CountryName");
        var statesprovinces = $("#StateProvince");
        countries.change(function () {
            statesprovinces.find('option').remove();
            var url = '@Url.Action("GetStatesProvinces", "Base")';
            $.getJSON(url, { countryId: countries.val() }, function (data) {
                $(data).each(function () {
                    $("<option value=" + this.ID + ">" + this.Name + "</option>").appendTo(statesprovinces);
                });
            });
        });
    });
</script>

I'd appreciate any feedback or input anyone out there has, Thanks

JP

+5  A: 

You partial looks much like an editor template so you could include it as such (assuming of course that your partial is placed in the ~/views/controllername/EditorTemplates subfolder):

@Html.EditorFor(model => model.SomePropertyOfTypeLocaleBaseModel)

Or if this is not the case simply:

@Html.Partial("nameOfPartial", Model)
Darin Dimitrov
Thanks for the feedback...Html.EditorFor may be a good idea in this instance - but i'd be interested to see alternatives as this is not the case for more complex examples - i'll definitely be running into this again soon.Html.Partial will not work as it must derive from ViewPage or ViewUserControl whereas the razor partial derives from WebViewPage...
JP
Html.Partial works perfectly fine. Start a new ASP.NET MVC 3 project in Visual Studio using the Razor view engine, open the `_Layout.cshtml ` file in the `Shared` folder and checkout how the inclusion of `_LogOnPartial.cshtml` which derives from `WebViewPage` is done (using Html.Partial). So no, the partial doesn't need to derive from `ViewPage` or `ViewUserControl` at all for `Html.Partial` to work.
Darin Dimitrov
Hmmm, it looks like you are correct. It also looks like i've got some debugging to do. Thanks!
JP