2010-04-29 75 views
0

有没有更容易的方法来更新与L2S对象,然后按属性做属性?用ASP.NET MVC更新L2S的对象

这就是我现在所做的:

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(); 
} 

我希望有一种方法,只是说objToUpdate = OBJ然后提交更改???

任何帮助,将不胜感激!

回答

-1

你是对的。您需要有一个DataContext来实际执行更新,而MVC将无法为您创建。但是,您可以做很多事情来减少控制器中的代码,使其看起来更简单。这是我们在工作中所做的。我们采用模板化方法以更清洁的方式处理事情。

1

我用下面的模式的一个稍微复杂的变化:

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(); 
    } 

    } 
} 

这可以让你写一个基本的更新动作简单:

public ActionResult Update(int id) 
{ 
    return Update<Customer>(c => c.CustomerID == id); 
} 

这将使用不同的过载的上述代码,其中Action<,>未传入,用于允许您注入自定义绑定代码(如果TryUpdateModel不足)。例如:

public ActionResult Update(int id) 
{ 
    return Update<Customer> 
    (
    c => c.CustomerID == id, 
    (context, c) => 
    { 
     c.LastModified = DateTime.Now; 
    } 
); 
} 

它不是为所有更新的情况下具有足够的灵活性,但可能足以满足最愚蠢的CRUD场景。您可以使用它来集中您的异常处理,日志记录和困难类型属性的映射(主要是布尔值,因为如果未选中复选框,而且还可以为空值类型,则不会在HTML中发布复选框)。