Foreach 语句使用非操作方法,不包含 'GetEnumerator' 的 public 方法
Foreach statement using a nonaction method, does not contain a public method for 'GetEnumerator'
我有一个具有以下 NonAction 方法的控制器 "MessageController":
[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;
}
它从存储库中获取 "messages" 并反转它们并忽略第一条消息。在我看来,我想将上面的 "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>
BackwardsListOfElements 被识别为 MvcHtmlString。我有一个编译器错误,显示为
Foreach statement cannot operate on variables of type 'System.Web.Mvc.MvcHtmlString' because 'System.Web.Mvc.MvcHtmlString' does not contain a public definition for 'GetEnumerator'.
是否可以在不将我的模型声明为 IEnumerable 的情况下迭代 BackwardsListOfElements?这需要编写我自己的 foreach HTML 助手吗?是否可以将 BackwardsListOfElements 显式声明为 System.Collections.IEnumerable?
如果您需要更多信息,请告诉我。预先感谢您的帮助。
它不会工作,因为 @Html.Action("BackwardsListOfElements", "Message");
returns 字符串不是 IEnumerable<string>
作为你的 childaction 方法 returns.
您应该在 ViewData 或模型中传递 IEnumerable,然后您应该像下面那样迭代它们。
ViewData["someData"] = BackwardsListOfElements()
并在您的视图中使用它,如下所示
var data = (IEnumerable<string>) ViewData["someData"]
foreach(var item in data)
{
//your code here
}
或者,如果您有带数据的强类型模型 属性,那么您可以像下面那样进行操作。
foreach(var item in Model.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>
我知道我明确表示我不想将我的模型作为 IEnumerable 传递,但没有办法解决它。谢谢你的回答。
我有一个具有以下 NonAction 方法的控制器 "MessageController":
[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;
}
它从存储库中获取 "messages" 并反转它们并忽略第一条消息。在我看来,我想将上面的 "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>
BackwardsListOfElements 被识别为 MvcHtmlString。我有一个编译器错误,显示为
Foreach statement cannot operate on variables of type 'System.Web.Mvc.MvcHtmlString' because 'System.Web.Mvc.MvcHtmlString' does not contain a public definition for 'GetEnumerator'.
是否可以在不将我的模型声明为 IEnumerable 的情况下迭代 BackwardsListOfElements?这需要编写我自己的 foreach HTML 助手吗?是否可以将 BackwardsListOfElements 显式声明为 System.Collections.IEnumerable?
如果您需要更多信息,请告诉我。预先感谢您的帮助。
它不会工作,因为 @Html.Action("BackwardsListOfElements", "Message");
returns 字符串不是 IEnumerable<string>
作为你的 childaction 方法 returns.
您应该在 ViewData 或模型中传递 IEnumerable,然后您应该像下面那样迭代它们。
ViewData["someData"] = BackwardsListOfElements()
并在您的视图中使用它,如下所示
var data = (IEnumerable<string>) ViewData["someData"]
foreach(var item in data)
{
//your code here
}
或者,如果您有带数据的强类型模型 属性,那么您可以像下面那样进行操作。
foreach(var item in Model.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>
我知道我明确表示我不想将我的模型作为 IEnumerable 传递,但没有办法解决它。谢谢你的回答。