up vote 0 down vote favorite

Hi,

I'm looking for the best method for the following issue I have.

I current have a large number of objects that all inherit for a single base object and are all very similar. Is there a solution available the will allow one create action and one edit action without needing to replicate a lot of the same code.

So for example I might have a person object:

public class PersonBase
{
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

And then I will have a number of objects the inherit from Person like:

public class SalesPerson : PersonBase
{
  public double TotalCommission { get; set; }
}

public class Customer: PersonBase
{
  public string Address { get; set; }
}

Now currently I have an action that will create a customer base:

[HttpPost]
public virtual ActionResult Create(FormCollection collection)
{
  var person = new PersonBase();

  UpdateModel(person);

  if ( Model.IsValid && person.IsValid )
  {
    // Save to the db
  }

  return View();
}

Now I can quite easily copy this code and modify it so I can create a salesPerson and customer but I will have a large number of objects based off PersonBase and it would be a lot of repetition of similar code which I would like to avoid.

Is the way of making the Create action more generic for all types of Person?

Thanks

link|flag

2 Answers

up vote 0 down vote

You could Use Generics

public class MyGenericPersonController<T> : Controller where T : PersonBase
{
  public virtual ActionResult Create<T>(FormCollection collection) 
  { 
     // your code here according to T
  }
}
link|flag
How will the controller know which person type it is from the link? For example my urls might be /create/person/type/1 and /create/person/type/2 where 1 is a sales person and the 2 is a customer. Im after a standard link for all create url rather that having a different url for each type. – Simon G Jun 15 at 15:06
1  
This solution woulnt allow you to create one controler but many child controllers (ie child classes). you would inherit MyGenericPersonController<T> to create CustomerController<Customer> and SalemanController<Salesman> – John Hartsock Jun 15 at 15:22
up vote 0 down vote accepted

The solution I found that worked for me was to use the dynamic from C# 4. So my code looks like:

[HttpPost]
public virtual ActionResult Create(int type, FormCollection collection)
{
      dynamic person = new PersonBase();

      if ( type == 1 )
        person = new SalesPerson();
      else if ( type == 2 )
        person = new Customer();

      UpdateModel(person);

      if ( Model.IsValid && person.IsValid )
      {
        // Save to the db
      }

      return View();
}
link|flag
I'm not sure I would consider this a good use of dynamics. I think John's generics answer would be more appropriate in this case. – Ryan Jun 15 at 17:06

Your Answer

get an OpenID
or
never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.