2011-03-01 68 views
0

當你有一些項目從ASP.NET MVC應用程序(如發佈文件的集合)插入到DB你執行大部分的異常處理邏輯在控制器或inisde存儲庫?插入對象的集合到數據存儲從ASP.NET MVC控制器

你做到這一點

[AcceptVerbs(HttpVerbs.Post)] 
    public virtual ActionResult Import(HttpPostedFileBase fileToUpload) 
    { 
     string path = Server.MapPath("~/App_Data/Upload/") + Path.GetFileName(fileToUpload.FileName); 
     fileToUpload.SaveAs(path); 
     string selectCmd = "SELECT * FROM [Pricelist$]"; 

     try { 
      foreach (DataRow dr in ExcelUtility.ReadFile(path, selectCmd).Tables[0].Rows) { 
       Product p = new Product 
       { 
        Title = dr["product_name1"].ToString().Trim(), 
        Measure = dr["product_measure"].ToString().Trim(), 
       }; 

       if (dr["product_price"] != DBNull.Value) 
        p.Price = (double)dr["product_price"]; 
       if (dr["product_taxrate"] != DBNull.Value) 
        p.TaxRate = (double)dr["product_taxrate"]; 
       _repository.Add(p); 
      } 
     } 
     catch (Exception e) { 
      // handle exception or run the action in transaction?? 
     } 

     return RedirectToAction("ImportSuccessful"); 
    } 

或別的東西(也許處理異常的存儲庫,並有庫行動回報真/假基於該方法是否成功執行或不)?

回答

0

由於我的問題沒有形成我的能力,因爲我實際上並不知道我到底想要什麼答案,所以我會發布我提出的解決方案在這最後一天。

首先,我的存儲庫處理所有的數據功能。其次,無論數據插入是否成功,我的存儲庫方法都會返回true/false(插入數據庫時​​可能會出現問題,而非例外情況,只是某些業務規則失敗)。 第三,我的存儲庫方法構建了一個通過輸出參數返回的報告。

這是現在的控制器動作代碼:

// 
    // POST: /admin/post/import 
    [HttpPost] 
    public virtual ActionResult Import(HttpPostedFileBase fileToUpload) 
    { 
     string path = Server.MapPath("~/App_Data/Upload/") + Path.GetFileNameWithoutExtension(fileToUpload.FileName) + "-" + Guid.NewGuid() + Path.GetExtension(fileToUpload.FileName); 
     fileToUpload.SaveAs(path); 
     string report = string.Empty; 
     bool success = _repository.ImportPostcodes(path, out report); 
     TempData["ImportReport"] = report; 
     if (success) 
      return RedirectToAction(MVC.admin.Post.ActionNames.ImportSuccess); 
     else 
      return RedirectToAction(MVC.admin.Post.ActionNames.ImportFailed); 
    } 

這是庫接口:

public interface IPostCodeRepository 
{ 
    IApplicationState AppState { get; set; } 
    void Add(PostCode instance); 
    void Delete(PostCode instance); 
    void Delete(Guid rowGuid); 
    void Delete(string postalCode); 
    IQueryable<PostCode> GetAll(); 
    IQueryable<PostCode> GetAll(string query); 
    PostCode Load(Guid rowGuid); 
    PostCode Load(string postalCode); 
    void SaveChanges(); 
    void Update(PostCode instance); 
    bool ImportPostcodes(string path, out string report); 
} 

我想這是因爲它gets..but如果有人評論爲最佳在上面,成爲我的客人。

0

我首先將try塊中的所有邏輯移動到模型(或存儲庫)中。這將在控制器中留下很少 - 這是一件好事。

也許我會留在控制器的唯一邏輯將是一個if塊來決定用戶是否需要被重定向到一個「成功」或「錯誤」頁面。

1

控制器操作中的SQL查詢和DataRows? Oh no。這段代碼讓我想起了WebForms的好日子:-)你真的應該是putting your controllers on a diet

+0

這是故意的。我有一個使用DI的存儲庫,但是我已經發布了這個更明顯的表示,我們在一個POST請求中插入多個項目。 – mare 2011-03-01 22:40:13

1

正如@Hector和@Darin Dimitrov所說,你應該讓控制器變得更薄。

要回答你的問題「處理異常或交易運行操作?」,

  • 是的,你需要在事務中運行,如果你的應用程序不允許進口部分。您可能需要使用Unit Of WorkActionFilter
  • 處理異常?我會趕上SomeSpecificException這可能是由ExcelUtility.ReadFile方法提出,但不是Exception類。您需要根據您的應用要求定義例外情況Here是關於Scott Hanselman的異常處理的the great blog post
相關問題