oglester
oglester

Reputation: 6655

How do I pass multiple objects to ViewPage in ASP.NET MVC?

I think I know the answer, but I would like to bounce around some ideas.

I would like to pass several (in this instance 2) somewhat different pieces of data to a View. My initial thought is simply to wrap-up the various objects into a containing object and pass them along that way. Then from the View, I'd have something like

var objContainer = ViewData.Model;
var thisObject = objContainer.ThisObject;
var thatObject = objContainer.ThatObject;

and these could be used independently in the Master Page and View Page.

Is that the "best" way?

Upvotes: 6

Views: 5769

Answers (3)

user1228
user1228

Reputation:

I've got the same dealie going on. Here's my solution (may not be the best practice, but it works for me).

I created a number of "Grouping" classes:

public class Duo<TFirst,TSecond> { /*...*/ }
public class Trio<TFirst,TSecond, TThird> { /*...*/ }

and a factory object to create them (to take advantage of type inference... some of the TFirsts and TSeconds and TThirds can be LONG)

public static class Group{

public static Duo<TFirst, TSecond> Duo(TFirst first, TSecond second) { 
  return new Duo<TFirst, TSecond>(first, second);
 }    
/*...*/
}

It gives me type safety and intellisense with a minimum of fuss. It just smells because you're grouping together classes that essentially have no real relation between them into a single object. I suppose it might be better to extend the ViewPage class to add a second and third ViewModel, but the way I did it takes lots less work.

Upvotes: 1

David P
David P

Reputation: 3634

I find it useful to create additional classes dedicated that are to be presented to the Views. I keep them in a separate namespace called 'Core.Presentation' to keep things organized. Here is an example:

namespace Core.Presentation
{
    public class SearchPresentation
    {
        public IList<StateProvince> StateProvinces { get; set; }
        public IList<Country> Countries { get; set; }
        public IList<Gender> Genders { get; set; }
        public IList<AgeRange> AgeRanges { get; set; }
    }
}

Then I make sure that my View is a strongly typed view that uses the generic version of that presentation class:

public partial class Search : ViewPage<SearchPresentation>

That way in the View, I can use Intellisense and easily navigate through the items.

Upvotes: 11

Tim Scott
Tim Scott

Reputation: 15205

Yes, the class that you specify as the model can be composed of other classes. However, why not just use the dictionary like so:

ViewData["foo"] = myFoo;
ViewData["bar"] = myBar;

I think this is preferable to defining the model as a container for otherwise unrelated objects, which to me has a funny smell.

Upvotes: 1

Related Questions