2013-05-27 64 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)); 

     } 

在你的控制器中。