来自aspx页面的代码中的访问列表

时间:2010-10-27 15:22:47

标签: c# asp.net-4.0

我的代码隐藏看起来像这样

    class Image
    {
        public string tnImg { get; set; }
        public string Name { get; set; }
        public string city { get; set; }
        public string refPlace { get; set; }
        public string refInfo { get; set; }
        public string refInfoDynamic { get; set; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        getImgCarousel();
    }

    public void getImgCarousel()
    {
        List<Image> Images = new List<Image>();

        var carouselImages = new Image();
        carouselImages.Name = "test";

        var carouselImages2 = new Image();
        carouselImages2.Name = "test2";

        Images.Add(carouselImages);
        Images.Add(carouselImages2);
    }

然后我想在.aspx

中执行以下操作
<div class="wrapCarousel">  
 <div>My Images</div>
   <% foreach(var image in Images) { %>
      <div><%=image.Name%></div> <!-- format your markup here -->
   <% } %>

</div>

但似乎我无法访问.aspx页面中的图像列表...有什么建议吗?

谢谢M

5 个答案:

答案 0 :(得分:2)

你应该在你的类中使Images一个字段(局部变量只能在它们声明的范围内看到):

List<Image> images = new List<Image>();

protected List<Image> Images
{
    get { return this.images; }
}

public void getImgCarousel()
{
    var carouselImages = new Image();
    carouselImages.Name = "test";

    var carouselImages2 = new Image();
    carouselImages2.Name = "test2";

    Images.Add(carouselImages);
    Images.Add(carouselImages2);
}

答案 1 :(得分:2)

您的Images变量是getImgCarousel方法的本地变量,无法在其外部看到。

将其提升为公共财产(或字段),以便在方法之外访问它:

// readonly property - will throw null reference if not initialized
public IList<Image> Images { get;}

public void getImgCarousel()
{
    this.Images = new List<Image>();

    var carouselImages = new Image();
    carouselImages.Name = "test";

    var carouselImages2 = new Image();
    carouselImages2.Name = "test2";

    Images.Add(carouselImages);
    Images.Add(carouselImages2);
}

答案 2 :(得分:0)

查看Images字段的可访问性。它是您方法中的私有临时变量。将它作为您班级的公共领域,您将能够访问它。

答案 3 :(得分:0)

在运行时,通过创建一个继承自代码隐藏类的新类来呈现aspx页面,因此,由于可访问性规则,任何私有类/字段/方法都是不可访问的。

您必须将aspx代码应该使用的任何内容声明为protected,因为这样可以访问任何继承的类。

在你的代码中,Images是方法的本地,因此即使是同一个类中的其他方法(即Page_Load)也无法访问它,更不用说生成的子类了。正如大多数其他答案所指出的那样,您需要将其从方法中删除,然后将其移至属性。

但这意味着您将Image对象公开给您的子类,这些子类是在您的基类中定义的,没有任何修饰符(class Image),编译器将其视为private class Image,这意味着没有其他类可以任何方式,形状或形式访问Image类。

那么为了解决这个问题,你需要将嵌套类声明为protected,因此你的子类aspx可以访问它。

我强调了所做的更正:

//accessible to the code-front
protected List<Image> Images {get; private set; }

//nested class also accessible to the code-front
protected class Image
{
    public string tnImg { get; set; }
    public string Name { get; set; }
    public string city { get; set; }
    public string refPlace { get; set; }
    public string refInfo { get; set; }
    public string refInfoDynamic { get; set; }
}

//exactly the reason why by default Page_Load is protected
protected void Page_Load(object sender, EventArgs e)
{
    getImgCarousel();
}

//this should be private as will not be called by anything outside the class
private void getImgCarousel()
{
    //uses the property
    Images = new List<Image>();

    var carouselImages = new Image();
    carouselImages.Name = "test";

    var carouselImages2 = new Image();
    carouselImages2.Name = "test2";

    Images.Add(carouselImages);
    Images.Add(carouselImages2);
}

答案 4 :(得分:0)

你很接近,Andrew Bezzub的答案很有帮助,但你还需要使Image类可以访问。

// Make the list protected
protected List<Image> Images;

// Make the class protected
protected class Image
{
    ...
}

protected void Page_Load( object sender, EventArgs e )
{
    ...
}

public void getImgCarousel()
{
    // Assign to the protected field.
    Images = new List<Image>();

    ...
}