2015-02-09 84 views
1

我有一個控制器「MessageController」具有以下無爲法的公共方法:foreach語句,不包含「的GetEnumerator」

[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

This line var BackwardsListOfElements = @ Html.Action(「BackwardsListOfElements」,「Message」);是問題。你不需要這個工作。 – 2015-02-09 06:10:37

+2

這是完成你的目標的非常愚蠢的方式。你有像viewbag,viewdata這樣的東西,爲什麼你不使用它們,或者如果你想訪問任何方法,然後建立一個控制器的對象並訪問它的公共方法。 – 2015-02-09 06:13:50

回答

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傳遞,但是沒有辦法繞過它。謝謝您的回答。

1

它不會工作,因爲@Html.Action("BackwardsListOfElements", "Message");返回字符串不是IEnumerable<string>作爲您的childaction方法返回。

您應該在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 
}