MVC C#将项目添加到列表<>在foreach内

时间:2011-04-03 19:02:01

标签: asp.net-mvc-2 list google-maps c#-3.0 foreach

我正在做一些事情,虽然我通常没有问题c#我脑部崩溃并且有点卡住......

在我的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;            
    }

我还有一个Markers控制器如下:

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}};

但是多个项目怎么样?

2 个答案:

答案 0 :(得分:1)

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

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

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

然后,您确定内部列表始终已初始化。

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

答案 1 :(得分:0)

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

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