使用非动作方法的Foreach语句不包含' GetEnumerator'的公共方法。

时间:2015-02-09 06:06:19

标签: c# asp.net-mvc razor foreach

我有一个带有以下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;
    }

它从存储库中获取“消息”并反转它们并忽略第一条消息。在我看来,我想将上面的“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语句不能对'System.Web.Mvc.MvcHtmlString'类型的变量进行操作,因为'System.Web.Mvc.MvcHtmlString'不包含'GetEnumerator'的公共定义。

是否可以迭代BackwardsListOfElements而不将我的模型声明为IEnumerable?这需要编写我自己的foreach HTML帮助器吗?是否可以将BackwardsListOfElements显式声明为System.Collections.IEnumerable?

如果您需要更多信息,请与我们联系。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

它不起作用,因为@Html.Action("BackwardsListOfElements", "Message");会在你的childaction方法返回时返回不是IEnumerable<string>的字符串。

你应该在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
}

答案 1 :(得分:0)

我最终将我的模型作为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传递,但没有办法绕过它。谢谢你的回答。