2010-10-13 63 views
3

在我的MVC 2應用程序中,我有一個調用Web服務的典型方法,構建一個JSON數據對象並將其返回給視圖。如何使用Automapper將poco映射到JSON

一切工作正常,但我想知道是否有辦法用Automapper做映射,所以我可以從我的控制器中刪除醜陋的代碼。在此先感謝

這裏是我的行動方法

public virtual ActionResult AllErrors(string sidx, string sord, 
             int page=1, int rows=10) 
    { 
     var pageSize = rows; 
     var pageNumber = page; 
     var orderBy = string.Format("{0} {1}", sidx, sord); 

     var result = errorService.GetPagedOpenErrors(pageSize, page, orderBy); 
     var errors = new List<IngestionErrorDataContract>(result.IngestionErrors); 
     var totalPages = (int) Math.Ceiling(result.TotalRows/(float) pageSize); 

     int index = 0; 
     var list = new List<object>(); 
     errors.ForEach(e => list.Add(
           new { 
             i = index++, 
             cell = new[] 
             { 
              e.IngestionErrorId.ToString(), 
              e.RunId.ToString(), 
              e.ProcessDate.ToShortDateString(), 
              e.Status, 
              e.ErrorDetails 
             } 
            })); 

     var jsonData = new 
          { 
           total = totalPages, 
           page = pageNumber, 
           records = result.TotalRows, 
           rows = list.ToArray() 
          }; 

     return Json(jsonData, JsonRequestBehavior.AllowGet); 
    } 
+0

提取映射代碼放到一個單獨的類和ü可能最終的東西一般 – Omu 2010-10-13 20:52:05

回答

2

我解決它使用AutoMapper的ConstructUsing方法。 這裏是我的地圖

public void CreateMap() 
    { 
     Mapper.CreateMap<List<IngestionErrorDataContract>, object[]>() 
      .ConvertUsing(
       errors => 
        { 
         int index = 0; 
         var list = new List<object>(); 
         errors.ForEach(e => list.Add(
          new 
           { 
            i = index++, 
            cell = new[] 
               { 
                e.IngestionErrorId.ToString(), 
                e.RunId.ToString(), 
                e.ProcessDate.ToShortDateString(), 
                e.Status, 
                e.ErrorDetails 
               } 
           })); 
         return list.ToArray(); 
        }); 
    } 

,這裏是我的操作方法現在

public virtual ActionResult AllErrors(string sidx, string sord, int page=1, int rows=10) 
    { 
     var pageSize = rows; 
     var pageNumber = page; 
     var orderBy = string.Format("{0} {1}", sidx, sord); 

     var result = errorService.GetPagedOpenErrors(pageSize, page, orderBy); 
     var errors = new List<IngestionErrorDataContract>(result.IngestionErrors); 
     var totalPages = (int) Math.Ceiling(result.TotalRows/(float) pageSize); 

     var jsonData = new 
          { 
           total = totalPages, 
           page = pageNumber, 
           records = result.TotalRows, 
           rows = mapper.Map<List<IngestionErrorDataContract>,object[]>(errors) 
          }; 

     return Json(jsonData, JsonRequestBehavior.AllowGet); 
    } 

好多了,我認爲

相關問題