【发布时间】:2010-11-13 00:25:33
【问题描述】:
在我看来,我正在从网络服务返回一些结果并将它们存储在会话变量中。
这里是会话存储方法:
//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;
}
}
在控制器中,我将结果设置为此会话,以省去一次又一次推送请求(用于分页)。
所以我将会话设置为结果集:
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、index、create strongly typed view,选择webservice.AreaSummary和list。
【问题讨论】:
-
您如何使用中继器和数据网格以及 ASP.NET MVC。我想更好的问题是,为什么?
-
该问题旨在避免在 ASP.NET MVC 中使用中继器,这就是解决方案所允许的。添加一个愚蠢的问题,因为我确实指定我不想使用中继器方法。同样在 Wekeroad 上,显示这些 ASP.net 控件可以毫无问题地使用,他是对的,因为它们确实有效。但根据问题,我不想走那条路。
标签: .net asp.net-mvc .net-3.5 c#-3.0