Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET MVC - MasterPageView and RenderPartials - Confusion

Tags:

asp.net-mvc

I'm a little confused with trying to do bring a list of Categories into a navigation bar on a MasterPageView in the latest release of the ASP.NET MVC framework. I have 0 experience with Partials so far (this adds to the confusion).

Should I use this variant of the RenderPartial?

HtmlHelper.RenderPartial(string partialViewName, object model)

I wasn't able to find any good examples of this method. By convention there is no model associated with the MasterPageView right? So what is the proper way to push or pull data into a "partial" from the MasterPageView?

Assuming that this method is absolutely going down the wrong path:

    <div id="navigation">
        <% 
            CategoryRepository cr = new CategoryRepository();
            IList<Category> lst = cr.GetCategories();
            Html.RenderPartial("NavBar", lst);
        %>
    </div>
like image 212
BuddyJoe Avatar asked Mar 11 '09 20:03

BuddyJoe


3 Answers

Do you not want your masterpage to have viewdata? You could solve it by having a base view data class that ALL your other viewdata classes inherit from...

BaseViewData.cs - this is a viewdata class that all other viewdata classes will inherit from

public class BaseViewData
{
    public string Title { get; set; }
    public string MetaKeywords { get; set; }
    public string MetaDescription { get; set; }
    IList<Category> NavCategoryList { get; set; }
}

Now in your Site.Master page simply have

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<BaseViewData>" %>

<title><%=ViewData.Model.Title %></title>
<meta name="keywords" content="<%=ViewData.Model.MetaKeywords %>" />
<meta name="description" content="<%=ViewData.Model.MetaDescription %>" />

<%= Html.RenderPartial("NavBar", ViewData.Model.NavCategoryList) %>

This could significantly impact your application architecture, but its not necessarily a bad thing.

HTHs, Charles

like image 131
Charlino Avatar answered Nov 12 '22 03:11

Charlino


public ActionResult NavBar()
{

            CategoryRepository cr = new CategoryRepository();
            IList<Category> lst = cr.GetCategories();


            return View(lst);
}

on your partial call

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%@ Import Namespace="app.Models" %>

and do all your rendering ui here

<div id="navigation">
        <% 
           Html.RenderPartial("NavBar");
        %>
    </div>

you can do ActionResult calls in your controllers

like image 40
Ayo Avatar answered Nov 12 '22 02:11

Ayo


I would say that since it's the Master Page you would probably have to store your data that you are passing in ViewData with a string key. If it was a regular view page it would be better to have a strongly typed page, but this is a different case. So you would probably do something this in your controller:

ViewData["MasterPageData"] = FunctionToGetData();

And then on the Master Page something like this:

<% 
   if (ViewData["MasterPageData"] != null) 
   {
      Html.RenderPartial("ControlName.ascx", ViewData);
   } 
%>

Then in the control, process like you would on a normal view page:

<% var categories = (CastIfNeeded)ViewData["MasterPageData"]; %>

process as normal...

I haven't had to pass data to a master page yet, but that's how I would think you'd do it. More info here.

EDIT: Changed it around a little to reflect what I'm doing in my current project.

like image 38
Blair Scott Avatar answered Nov 12 '22 02:11

Blair Scott