C# 使用非操作方法的Foreach语句不包含';GetEnumerator';
我有一个控制器“MessageController”,具有以下非操作方法:C# 使用非操作方法的Foreach语句不包含';GetEnumerator';,c#,asp.net-mvc,razor,foreach,C#,Asp.net Mvc,Razor,Foreach,我有一个控制器“MessageController”,具有以下非操作方法: [ChildActionOnly] public IEnumerable<string> BackwardsListOfElements() { var allMessages = _messageRepository.GetAll().ToList(); List<string> reversedMessages = new List<
[ChildActionOnly]
public IEnumerable<string> BackwardsListOfElements()
{
var allMessages = _messageRepository.GetAll().ToList();
List<string> reversedMessages = new List<string>();
for (int i = allMessages.Count-1; i --> 0; )
{
reversedMessages.Add(allMessages.ElementAt(i).Subject + ": " + allMessages.ElementAt(i).Body);
}
IEnumerable<string> returnEnumerable = reversedMessages;
return returnEnumerable;
}
[ChildActionOnly]
公共IEnumerable backwardsListofements()
{
var allMessages=_messageRepository.GetAll().ToList();
List reversedMessages=新列表();
对于(int i=allMessages.Count-1;i-->0;)
{
reversedMessages.Add(allMessages.ElementAt(i.Subject+):“+allMessages.ElementAt(i.Body));
}
IEnumerable returnEnumerable=反向消息;
返回可枚举;
}
它从存储库中获取“消息”,并将其反转,并忽略第一条消息。在我看来,我想把上面的“returnEnumerable”消息添加到一个列表中。以下是我的观点代码:
@model MyProject.UI.Models.MessageModel
@{
var BackwardsListOfElements = @Html.Action("BackwardsListOfElements", "Message");
}
...
<a class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
@foreach(var item in BackwardsListOfElements)
{
<li><a href="#">@Html.Label(item.Body)</a></li>
}
</ul>
</li>
@model MyProject.UI.Models.MessageModel
@{
var backardslistofelements=@Html.Action(“backardslistofelements”,“Message”);
}
...
}
BackwardsListFements被识别为MvcHtmlString。我有一个编译器错误,读取
Foreach语句无法对“System.Web.Mvc.MvcHtmlString”类型的变量进行操作,因为“System.Web.Mvc.MvcHtmlString”不包含“GetEnumerator”的公共定义
是否可以在不将我的模型声明为IEnumerable的情况下迭代backwardsListFellements?这是否需要编写自己的foreach HTML助手?是否可以显式地将BackwardsListFelments声明为System.Collections.IEnumerable
如果你需要更多信息,请告诉我。提前感谢您的帮助。因为
@Html.Action(“backardslistofelements”,“Message”)
在childaction方法返回时返回字符串notIEnumerable
您应该在ViewData或model中传递IEnumerable,然后像下面这样迭代它们
ViewData["someData"] = BackwardsListOfElements()
在您的视图中使用它,如下所示
var data = (IEnumerable<string>) ViewData["someData"]
foreach(var item in data)
{
//your code here
}
最后,我以IEnumerable的形式传入了我的模型,并按如下方式遍历了模型中的项:
@using Myproject.UI.Helpers
@model IEnumerable<Myproject.UI.Models.MessageModel>
<li class="btn-group">
<a href="@Url.Action("Index", "Message")" class="btn btn-default">
<span class="badge">@Html.Action("NumberOfMessages", "Message")</span> @Html.Action("MostRecentMessage", "Message")
</a>
<a class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
@foreach (var item in Model)
{
<li>@Html.MenuItem(item.Subject+": "+item.Body, "Index", "Message")</li>
}
</ul>
</li>
@使用Myproject.UI.Helpers
@模型IEnumerable
@foreach(模型中的var项目)
{
- @MenuItem(item.Subject+“:”+item.Body,“Index”,“Message”)
}
我知道我明确表示我不想在我的模型中作为IEnumerable传递,但没有办法。感谢您的回答。此行var backardslistofelements=@Html.Action(“backardslistofelements”,“Message”);这就是问题所在。你不需要这样做,这是实现你目标的一种非常愚蠢的方式。你有像viewbag、viewdata这样的东西,所以为什么不使用它们呢?或者如果你想访问任何方法,那么就创建一个controller对象并访问它的公共方法。
@using Myproject.UI.Helpers
@model IEnumerable<Myproject.UI.Models.MessageModel>
<li class="btn-group">
<a href="@Url.Action("Index", "Message")" class="btn btn-default">
<span class="badge">@Html.Action("NumberOfMessages", "Message")</span> @Html.Action("MostRecentMessage", "Message")
</a>
<a class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
@foreach (var item in Model)
{
<li>@Html.MenuItem(item.Subject+": "+item.Body, "Index", "Message")</li>
}
</ul>
</li>