2010-04-29 4 views
0

Existe-t-il un moyen plus simple de mettre à jour un objet avec L2S autre que de le faire par propriété?Mise à jour d'un objet avec L2S avec ASP.NET MVC

C'est ce que je fais maintenant:

Public ActionResult Edit(Object obj) 
{ 
    var objToUpdate = _repository.Single<Object>(o => o.id = obj.id); 
    objToUpdate.Prop1 = obj.Prob1; 
    objToUpdate.Prop2 = obj.Prop2; 

    ... 

    _repository.SubmitChanges(); 
} 

J'espère qu'il ya une façon de dire que objToUpdate = obj puis soumettre les modifications ???

Toute aide à ce sujet serait appréciée!

Répondre

-1

Vous le faites correctement. Vous devez avoir un DataContext pour faire la mise à jour et MVC ne pourra pas créer cela pour vous. Cependant, il y a beaucoup de choses que vous pourriez faire pour réduire le code dans le contrôleur, donc cela semble beaucoup plus simple. C'est ce que nous faisons dans mon travail. Nous avons conçu des méthodes pour prendre soin des choses d'une manière beaucoup plus propre.

1

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).

Questions connexes