.net - ASP.NET MVC Conditional ViewModel Abstraction -


i new asp.net mvc , stuck on point. working on classified site. situation is, have lot of categories in user can post ads , each ad category have different view. have created controller action like

 public actionresult postad(string categoryname, string subcategoryname)  {         if(categoryname == "vehicle" && subcategoryname == "cars")         {              var model = new caradviewmodel();               // set caradviewmodel properties...               return view("caradcreateview", model);         }         else if(categoryname == "vehicle" && subcategoryname == "bikes")         {             var model = new bikeadviewmodel();               // set bikeadviewmodel properties...               return view("bikeadviewmodel", model);         }         else if(categoryname == "property" && subcategoryname == "renthouse")         {              var model = new renthouseadviewmodel();               // set renthouseadviewmodel properties...               return view("renthouseadviewmodel", model);                          }         else................... on , on  } 

my problem have huge number of categories , sub categories 60+. , if keep on coding above 60+ categories , subcategories, postad method going blast , become unmanageable.

please tell me best practice or pattern can bring me out of problem.

unfortunately, of doing cannot avoided. there needs form of model , view selection based on category.

use factory pattern. create base class:

public abstract class basecategory {   public abstract string getviewname();   public abstract object createmodelfromformdata(); } 

for each category, create sub-class derived basecategory , implement abstract functions.

in action, following:

public actionresult postad(string categoryname, string subcategoryname) {   basefactory factory;   if (categoryname == "vehicle")   {     if (subcategoryname == "cars")     {       factory = new carsfactory();     }     else ...   }   else ...    return view(factory.getviewname(), factory.createmodelfromformdata()); } 

i have couple reasons schema:

  1. i purposefully using if/else factory selection. controller going created , re-created every action call. pre-populating list , needlessly create objects categories not selected. simple if/else more efficient. if want prevent if/else, can put factories in dictionary , select based on categories, lot of needless constructor actions.

  2. i made createmodelfromformdata function because assume you'll need copy data posted form data. may require passing in data, left function parameterless.

  3. i used base/derived classes because copying of form data need custom model being created , form data being posted. also, saving persistent storage (file or database) may category-specific well.


Comments