2011-04-03 45 views
1

我正在做的事情,虽然我通常没有问题与C#我有一个大脑崩溃,有点卡...MVC C#添加项目到列表<>内foreach

在我的MVC应用程序我有一个负责管理谷歌地图的一些标记控制器(如下)

public ActionResult GetMarkers() 
    { 
     MarkerList markers = getMarkersForMap(); 

     return Json(markers, JsonRequestBehavior.AllowGet); 

    } 

    public MarkerList getMarkersForMap() 
    { 
     MarkerList ml = new MarkerList(); 

     foreach (var shop in dirRepo.getAllShops()) 
     { 
      Marker marker = new Marker 
      { 
       html = shop.ShopName, 
       lat = shop.Lat, 
       lng = shop.Lng, 
       label = shop.DirectoryID.ToString() 
      }; 

      ml.markers.Add(marker); // <<<< Object ref not set to an instance of an object 

     } 
     return m;    
    } 

我也有一个标记控制器如下:

public class MarkerList 
{ 
    public List<Marker> markers { get; set; } 
} 

public class Marker 
{ 
    public string lat { get; set; } 
    public string lng { get; set; } 
    public string html { get; set; } 
    public string label { get; set; } 
} 

数据被填充在foreach没问题, 但是我要 将多个标记添加到列表中,以便我可以将它们传递回调用函数,并继续在我的查看页面中显示结果。我可以添加单件没有问题,这样做

return new MarkerList {markers = new List<Marker> {marker}}; 

但如何多个项目?

回答

1

您需要在MarkerList中使用初始化列表才能使用它。您可以在默认的MarkerList构造函数中初始化它。

public class MarkerList 
{ 
    public List<Marker> markers { get; set; } 

    public MarkerList() 
    { 
     markers = new List<Marker>(); 
    } 
} 

然后,你确定内部列表总是被初始化。

答案:为什么要将列表封装在仅包含此列表的对象中? MarkerList课目前没有任何好处。除非仅缩短问题需求,否则最好删除此课程并直接使用List<Marker>

+0

但是,从某人else示例中找到一些黑客和斜杠,直接使用列表是有意义的。 – Andrew 2011-04-03 19:20:14

0

ml.markers为空,因为您正在使用自动属性(无后备存储)。例如,您需要在ctor中初始化它。

但有一件事看起来很奇怪。首先,为什么标记是公开的,而不是以大写字母开头。而且更重要。访问内部列表时,MarkersList类是什么?现在它没有多大意义。将内部标记列表设为private/protected,并将AddMarker方法添加到MarkersList。或者只是在控制器中使用List并将其返回。