在我看来,我从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
传递给了repeater
而datagrid
或foreach
(我得到的)。
我的第一个想法是使用<% 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; index
,create strongly typed view
,webservice.AreaSummary
,选择list
和{{1}}。
答案 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,您是否想要引用一个字段?