Ik heb de afgelopen dagen nog maar eens een avondje of wat geknutseld om te kijken of ik het een en ander begrijp. Ik heb nu dit:
Model:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
| public class Contact : GenericIdentifyableEntity<Contact>
{
[Required]
[StringLength(100, MinimumLength = 3, ErrorMessage = "The {0} must be at least {2} characters long.")]
public String CompanyName { get; set; }
[GenericNavigation]
public Address Address { get; set; }
[NotMapped]
[ScriptIgnore]
public int RemoveMeViewFieldFoo { get; set; }
} |
DataAccess ((View)Model aan entity(/ies) koppelen)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| public class ContactAccess : GenericDataAccess<Contact>
{
private MyContext _context = null;
public ContactAccess(MyContext context)
: base(context)
{
_context = context;
}
protected override void BeforeSave(Contact contact)
{
contact.Address.CreateOrUpdate(_context, false);
}
protected override void BeforeDelete(Contact contact)
{
contact.Address.Delete(_context, false);
}
} |
Controller:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
| public class ContactsController : GridCrudController<Contact>
{
public ContactsController() : this(new MyContext()) { }
public ContactsController(MyContext context)
: base(context)
{
this.DataAccess = new ContactAccess(context);
this.GridModel.Prefix = this.GridModel.Caption = "Contacts";
}
} |
View:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| @model CodeCaster.MVC.Data.Model.JqGridModel
@{
ViewBag.Title = "Contacts";
}
@section Head
{
@{ Html.RenderPartial("~/Views/Shared/Grid/jqGridHeadPartial.cshtml"); }
<script type="text/javascript">
var colNames = ['Company name', 'Address', 'Zip code', 'Location', 'Operations'];
var colModel = [
{ name: 'CompanyName', index: 'CompanyName', width: 120 },
{ name: 'Address.AddressString', index: 'Address.AddressString', width: 200 },
{ name: 'Address.Zipcode', index: 'Address.Zipcode', width: 60 },
{ name: 'Address.LocationString', index: 'Address.LocationString', width: 200 },
{ name: 'ID', formatter: createOperationsLinks, width: 200 },
];
</script>
}
<h2>Contacts</h2>
<p>@Html.ActionLink("Create New", "Create")</p>
@{ Html.RenderPartial("~/Views/Shared/Grid/jqGridPartial.cshtml"); } |
En dat ziet er dan zo uit:
Verder voorziet de controller, dankzij een generieke base-implementatie, in CRUD-operaties voor het opgegeven Model. Daarnaast heeft die controller een JSON-feed van alle entities, die door het grid wordt aangesproken.

Op deze manier kan ik eenvoudig en snel CRUD-schermen bouwen voor generieke models, terwijl het geheel uitbreidbaar blijft voor models en views die meer vereisen.
Mijn vraag in eerste instantie ging over de koppeling tussen het viewmodel en het entity model, maar ik geloof dat ik dat met mijn DataAccess voorlopig heb opgevangen (ik vind dat data ophalen en koppelen helemaal geen controller-werk, een controller mapt URL's naar acties die
mogelijk iets met data doen, als dat het geval is dan spreken ze de DataAccess aan).
Als ik nu een niet-generiek viewmodel nodig heb (dat wil zeggen: een viewmodel dat níet één-op-één mapt naar een databasetabel), creëer ik een DataAccess voor dat model waarin ik de (hier niet zichtbare)
LoadAll(),
CreateOrUpdate() en
Delete() override en (bijvoorbeeld middels AutoMapper) een koppeling maak tussen de viewdata en de databasedata.
Over de naamgeving van sommige elementen ben ik nog niet tevreden, dat komt nog wel als ik hiermee verder ga. Ik begrijp de basis nu in ieder geval iets beter.
Voel je vrij dit ontwerp te bekritiseren.
[
Voor 7% gewijzigd door
CodeCaster op 15-11-2012 10:30
]