如何遍历视图中的列表?

时间:2009-07-22 13:48:15

标签: .net asp.net-mvc .net-3.5 c#-3.0

在我看来,我从Web服务返回一些结果并将它们存储在会话变量中。

以下是会话存储方法:

//AreaSummary[] is a reference to the webservice reference gubbins

 public AreaSummary[] Results
        {
            get
            {
                if (this.Results != null)
                {
                    return this.Results;
                }
                else
                {
                    if (HttpContext.Current.Session["Results"] != null)
                    {
                        this.Results = 
                                   (AreaSummary[])HttpContext.Current.Session["Results"];
                                   return this.Results;
                    }
                    else
                    {
                        return null;
                    }
                }
            }

            set
            {
                this.Results= null;
                HttpContext.Current.Session["Results"] = value;
            }
        }

在Controller中,我将结果设置为此会话,以节省必须一次又一次地推送请求(用于分页)。

所以我将会话设置为结果集:

this.mySess.SessionVarss.Results = myservice.SearchForX("stuff");

Results”和“SearchForX”都属于AreaSummary[]

ViewData["ResultSet"] = this.mySess.SessionVars.Results;

然后我在控制器中将其ViewData作为databind传递给了repeaterdatagridforeach(我得到的)。

我的第一个想法是使用<% foreach (var item in (ViewData["ResultSet"] as List<MyMVC.webservice.AreaSummary[]>)) { %> <li class="image"> <img src="<%=item.MainImage.ImageUrl %>" /> </li> <% } %> 循环。

所以我在尝试的视图中:

Object reference not set to an instance of an object.

我确信这个错误对某些人来说是显而易见的,而我却错过了隧道视觉。

它编译得很好,但死了以下错误:

<% 
   placelist.DataSource = ViewData["ResultSet"];
   placelist.DataBind();
%>
<asp:Repeater ID="productlist" runat="server" Visible="true">
 <ItemTemplate>
   <li class="image">
       <img src="<%# DataBinder.Eval(Container.DataItem, "MainImage.ImageUrl")%>" />
   </li>
 </ItemTemplate>
</asp:Repeater>

以下作品:

foreach

但是我更喜欢使用repeater循环,因为返回的一些项目是数组,而return View("index",SearchResults); 我最终会做更多。

正确的解决方案

最终更好的解决方案是将数据传递给视图:

add view

然后右键单击 - &gt; indexcreate strongly typed viewwebservice.AreaSummary,选择list和{{1}}。

2 个答案:

答案 0 :(得分:3)

我刚刚在另一个问题中发布了这个例子。试试这样的事情,

<table class="results" width="100%" border="0" cellpadding="5">
<thead class="tablehead">
  <tr> 
    <td width="55px"><b>Country</b></td>
    <td width="55px"><b>State</b></td>
    <td width="55px"><b>City</b></td>
    <td width="55px"><b>Town</b></td>
    <td width="55px"><b>Postal</b></td>
  </tr>
</thead>
<tbody>
<% 
    int count = 0;
    foreach (var item in (IEnumerable<MY_RESULTS>)ViewData["My_Results"])
    {
        if (count % 2 == 0) { Response.Write("<tr class='even'>"); } else { Response.Write("<tr class='odd'>"); }   
    %>
            <td><%= Html.Encode(item.Country)%></td>
            <td><%= Html.Encode(item.State)%></td>
            <td><%= Html.Encode(item.City)%></td>
            <td><%= Html.Encode(item.Town)%></td>
            <td><%= Html.Encode(item.Postal)%></td>
        </tr>

    <% count += 1; } %>
</tbody>
</table>

答案 1 :(得分:0)

你的for循环看起来不错,虽然session和viewdata不是完全相同的东西。

Viewdata存储在会话中,但是直接存储在会话中的任何内容都必须从视图中的会话中引用。在您的情况下,您将值存储在Session [“Results”]中,然后尝试在ViewData [“ResultSet”]的视图中引用它。

以下看起来也有点怀疑。

public AreaSummary[] Results
    {
        get
        {
            if (this.Results != null)
            {
                return this.Results;
            }

这是一个递归调用,它看起来有点不稳定。您正在引用getter中的Property getter,您是否想要引用一个字段?