2012-05-11 105 views
2
IEnumerable<Addresses> AddressSet1=myServices.GetAddresses(LocationId1); 
IEnumerable<Addresses> AddressSet2=myServices.GetAddresses(LocationId2); 

我想上面的兩個AddressSets追加合併兩個IEnumerable的項目

我試圖IEnumerable<Addresses> AllAddresses=AddressSet1.Concat(AddressSet2)

但在此之後,當我試圖通過我的Razor視圖訪問自IEnumerable AllAddresses項目結合

@if(!myHelper.IsNullorEmpty(model.AllAddresses) 
    { 
    @Html.EditorFor(model => model.AllAddresses ) 
    } 

我得到的錯誤 - 路徑中的非法字符。任何建議,以確定此錯誤的原因?

如果我想用Concat運行我的頁面,我可以看到頁面上顯示的AddressSet1/AddressSet2中的記錄。但是當我嘗試將兩者組合起來形成Enumerable AllAddresses時,它會拋出錯誤幫助

粘貼下面是我的編輯模板

@model MyServiceRole.Models.Addresses 
@{ 
    ViewBag.Title = "All addresses Items"; 

    } 
<table> 
<tr> 
<td> 
<span>Index</span> 

    </td> 
    <td> 

</tr> 
<tr> 
<td>Address XID</td> 
<td> 
@Html.EditorFor(model => model.AddressID) 
</td> 
</tr> 
<tr> 
<td>Title</td> 
<td> 
@Html.EditorFor(model => model.Title) 
</td> 
</tr> 
<tr> 
<td>Description</td> 
<td> 
@Html.EditorFor(model => model.Description) 
</td> 
</tr> 
<tr> 
<td>Image URL</td> 
<td> 
@Html.EditorFor(model => model.Photo.URL) 
</td> 
</tr> 
</table> 
+1

問題可能出現在您的編輯器模板中。你能爲它顯示標記嗎? – jrummell

+2

您沒有提出任何問題,請嘗試再次閱讀您的帖子。但我可以放心地說,路徑錯誤中的非法參數與Concat調用無關。 – driis

+0

您的IEnumerable泛型使用Address類,但您的編輯器模板使用AddressRecords類型的類。這是一個錯字嗎?你是說,如果不是concat調用你只需設置AllAddresses = AddressSet1它的作用? – DMulligan

回答

0

如果你要使用編輯模板爲什麼你寫foreach循環?根本不需要這個循環。只需編寫以下和擺脫foreach

@Html.EditorFor(x => x.AllAddresses) 

,然後你會明顯有相應的編輯模板ASP.NET MVC將自動呈現爲AllAddresses集合中的每個元素,這樣你就不需要寫任何foreach循環在你的視圖(~/Views/Shared/EditorTemplates/Address.cshtml):

@model Address 
... 
2

我測試您的問題和遇到同樣的問題。

List<string> a = new List<string>{ "a" }; 
List<string> b = new List<string>{ "b" }; 

IEnumerable<string> concat = a.Concat<string>(b); 
foreach(string s in concat) { } // this works 

return View(concat); 

鑑於:

@model IEnumerable<string> 

@foreach(string s in Model) //This blows up 
{ 
} 
@Html.EditorFor(m => Model) //Also blows up 

它看起來像你真的不能使用模板或枚舉的

System.Linq.Enumerable.ConcatIterator<T> 

Concat一個視圖中創建。這看起來像一個錯誤。

無論如何,添加.ToList()修復您的問題。

​​
+0

只是爲了擴大這個。看起來,當試圖猜測適當的模板時,MVC正在查看可枚舉的實際運行時類型。 Concat(以及幾乎所有其他的LINQ函數)都依賴於私有通用運行時類型,其中包含'<' and '>'字符,這些字符在文件路徑中當然是非法的。不幸的是,似乎唯一的解決方法是通過顯式迭代枚舉來繞過模板推理邏輯。 –

+0

@PhilDegenhardt:這不是說'@ foreach'語法應該工作,而@ Html.EditorFor'語法不應該工作嗎?由於'ToList'起作用,它似乎是迭代器本身特有的東西,而不是泛型的使用。 – CSJ

+0

同意。當我說「明確迭代」時,我的意思是我期望@foreach能夠工作。但是,IIRC會導致EditorFor()的其他問題。 –