Search code examples
c#.netasp.net-mvcmodelentity-relationship

Model relationships in ASP.NET MVC


I recently started evaluating ASP.NET MVC. While it is really easy and quick to create Controllers and Views for Models with only primitive properties (like shown in the starter videos from the official page) I didn't find any good way to work with references to complex types. Let's say, I have these Models:

public class Customer {  
    public int Id { get; set; }  
    public string Name { get; set; }  
    public Address Address { get; set; }  
    public IList<Order> Orders { get; set; }  
}

public class Address {  
    public int Id { get; set; }  
    public string .....  
    .....  
}

public class Order {  
    public int Id { get; set; }  
    public Customer Customer { get; set; }  
    public string OrderName { get; set; }  
    .....  
}

Note that I don't have foreign keys in the models (like it's typical for LINQ to SQL, which is also used in the sample video) but an object reference.

How can I handle such references in asp.net mvc? Does someone has some good tips or links to tutorials about this problem? maybe including autobinding with complex types.


Solution

  • I would combine everything into my view model:

    CustomerViewModel.Customer
    CustomerViewModel.Address
    CustomerViewModel.Orders // maybe an IEnumerable<Order>
    CustomerViewMode.CurrentOrder
    

    You should be able to bind your complex objects without too much trouble using some of the input helpers:

    //.. begin form
    <%=Html.HiddenFor(m=>m.Customer.Id)%>
    <%=Html.TextboxFor(m=>m.Customer.FirstName)%>
    <%=Html.TextBoxFor(m=>m.Address.City)%>
    <%=Html.TextBoxFor(m=>m.ActiveOrder.OrderName%>
    //.. submit ..
    //.. end form ..
    

    The should bind back ok if your action method looks like:

    [HttpPost]
    public ActionResult UpdateComplexObject(string id, CustomerViewModel customerViewModel) {
    // if (!id.Equals(customerViewModel.Customer.Id) throw something
    // just one of my own conventions to ensure that I am working on the correct active
    // entity - string id is bound from the route rules.
    ValidateModel(customerViewModel);
    service.UpdateCustomer(customerViewModel.Customer);
    serviceOrder.UpdateOrder(customerViewModel.ActiveOrder);
    serviceAddress.UpdateAddress(customerViewModel.Address);
    return RedirectToAction("DisplayComplexObject"); // or whatever
    }
    

    Hal