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 传递,但没有办法解决它。谢谢你的回答。