2013-05-27 61 views
3

我正在处理一个处理表单/文档的控制器,而且我更多地提前完成任务中我在方法中看到的更多重复代码部分。这是我的第一个ASP应用程序在所有mvc或不,我不知道什么是最佳的方式来优化我的代码。我注意到的东西 - 那就是反复几次的模式是这样的:在asp.net mvc 3控制器中处理重复的代码

public ActionResult DisplayForm(int? documentId, long status) 
     { 
      ViewBag.Status = status; 

      List<MCS_DocumentFields> model = (List<MCS_DocumentFields>)DocumentFieldService.GetFieldsForDocument(documentId); 

      var finalModel = model 
       .OrderBy(c => c.ContentTypeId) 
       .ThenBy(c => c.RowNo) 
       .ThenBy(c => c.ColumnNo) 
       .ThenBy(c => c.MCS_Fields.Order) 
       .ToList(); 
      return View(finalModel); 
     } 

这是显示某种形式的方法。但是,当表单编辑我处理这个在另一种方法:

public ActionResult UpdateDocument(List<MCS_DocumentFields> collection) 
     { 
      //TODO deal with the repeating code 
      int? documentId = (int)collection[0].MCS_Documents.Id; 
      ViewBag.Status = 1; 
      List<MCS_DocumentFields> model = (List<MCS_DocumentFields>)DocumentFieldService.GetFieldsForDocument(documentId); 

      var finalModel = model 
       .OrderBy(c => c.ContentTypeId) 
       .ThenBy(c => c.RowNo) 
       .ThenBy(c => c.ColumnNo) 
       .ThenBy(c => c.MCS_Fields.Order) 
       .ToList(); 

      //var ts = collection; 
      return View("DisplayForm", finalModel); 

     } 

我要实现对数据的验证和更新的逻辑,但最后我想表现出同样的观点 - 与编辑的形式新的数据和一些适当的消息,如“保存成功”或类似的东西。

所以我想知道我能在这里做什么 - 在我的控制器中写一些私有方法,我会在需要的地方调用。也许有一种方法可以...例如 - 处理UpdateDocument方法中的保存,但然后UpdateDocument返回DisplayForm方法..我不确定。

回答

1

你可以用你的DisplayForm方法的调用,这样的回报:

public ActionResult UpdateDocument(List<MCS_DocumentFields> collection) 
{ 
    //TODO deal with the repeating code 
    int? documentId = (int)collection[0].MCS_Documents.Id; 
    long status = 1; 
    List<MCS_DocumentFields> model = (List<MCS_DocumentFields>)DocumentFieldService.GetFieldsForDocument(documentId); 

    return DisplayForm(documentId, status); 
} 

而且在DisplayForm,应指定渲染视图的名称,改变

return View(finalModel); 

return View("DisplayForm", finalModel); 

附录

你应该看看后重定向-get或者PRG模式:http://en.wikipedia.org/wiki/Post/Redirect/Get

下面这个模式时,你可以在代替UpdateDocument方法结束,返回重定向到DisplayForm。

return RedirectToAction("DisplayForm", new{ documentId, status }); 
+0

Thnaks,它似乎并不像许多人想告诉关于这个话题的东西,所以我会接受你的答案,并会尝试你的建议来优化我的代码。 – Leron

2

不知道更多关于您的应用程序,我建议如果可以的话,在DocumentFieldService.GetFieldsForDocument方法中进行排序。

如果你不能做到这一点,你可以做这样的事情:像你说的那么你可以做

public List<MCS_DocumentFields> GetSortedFieldsForDocument(documentID) 
     { 

      List<MCS_DocumentFields> model = (List<MCS_DocumentFields>)DocumentFieldService.GetFieldsForDocument(documentId); 

      var sorted = model 
       .OrderBy(c => c.ContentTypeId) 
       .ThenBy(c => c.RowNo) 
       .ThenBy(c => c.ColumnNo) 
       .ThenBy(c => c.MCS_Fields.Order) 
       .ToList(); 

      return sorted; 
     } 

作为一个私有方法:

public ActionResult DisplayForm(int? documentId, long status) 
     { 
      ViewBag.Status = status; 
      return View(GetSortedFieldsForDocument(documentId)); 
     } 

public ActionResult UpdateDocument(List<MCS_DocumentFields> collection) 
     { 
      //TODO deal with the repeating code 
      int? documentId = (int)collection[0].MCS_Documents.Id; 
      ViewBag.Status = 1; 

      return View("DisplayForm", GetSortedFieldsForDocument(documentId)); 

     } 

在你的控制器中。