Je l'ai utilisé un peu plus de variation complexe du schéma suivant:
protected ActionResult Update<T>(Expression<Func<T, bool>> predicate, Action<IDataContext, T> action, params string[] whitelist) where T : class
{
using (var context = ContextFactory.GetContext())
{
try
{
var model = context.GetTable<T>().Where(predicate).SingleOrDefault();
if (model == null) throw new ApplicationException("Item not found");
if (whitelist != null && whitelist.Length > 0)
{
TryUpdateModel(model, whitelist);
}
else
{
TryUpdateModel(model);
}
if (action != null) action(context, model);
context.SubmitChanges();
return Success();
}
catch (SqlException ex)
{
return HandleSqlException(ex);
}
catch (Exception ex)
{
return Failure();
}
}
}
Cela vous permet d'écrire une action de mise à jour de base aussi simple que:
public ActionResult Update(int id)
{
return Update<Customer>(c => c.CustomerID == id);
}
Il utilise une surcharge différente du code ci-dessus, où le Action<,>
n'est pas transmis, qui est utilisé pour vous permettre d'injecter du code de liaison personnalisé si TryUpdateModel
ne suffit pas. Par exemple:
public ActionResult Update(int id)
{
return Update<Customer>
(
c => c.CustomerID == id,
(context, c) =>
{
c.LastModified = DateTime.Now;
}
);
}
Il ne suffit pas flexible pour tous cas de mise à jour, mais suffit probablement pour les scénarios les plus CRUD muets. Vous pouvez l'utiliser pour centraliser la gestion des exceptions, la journalisation, la mise en correspondance des types de propriétés difficiles (principalement les booléens, car les cases à cocher ne sont pas publiées en HTML si elles ne sont pas cochées).