tags:

views:

752

answers:

3

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?

+1  A: 

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.

Will
+1  A: 

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.

Tim Scott
The biggest problem with this is you lose intellisense and type safety. Plus, you now have an additional dependency between the view and the model (that can't be enforced by the compiler) in that they both must know and understand what "foo" and "bar" means...
Will
+7  A: 

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.

David P