我有一个带有以下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?
如果您需要更多信息,请与我们联系。提前感谢您的帮助。
答案 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传递,但没有办法绕过它。谢谢你的回答。