【问题标题】:append two IEnumerable items附加两个 IEnumerable 项
【发布时间】:2012-05-11 16:43:12
【问题描述】:
IEnumerable<Addresses> AddressSet1=myServices.GetAddresses(LocationId1);
IEnumerable<Addresses> AddressSet2=myServices.GetAddresses(LocationId2);

我想把上面的两个AddressSets结合起来

我试过IEnumerable&lt;Addresses&gt; AllAddresses=AddressSet1.Concat(AddressSet2)

但在此之后,当我尝试通过我的剃刀视图访问 IEnumerable AllAddresses 中的项目时

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

我收到错误 - 路径中有非法字符。有什么建议可以确定此错误的原因吗?

如果我试图在没有 Concat 的情况下运行我的页面,我可以看到页面上显示的 AddressSet1 /AddressSet2 中的记录。但是当我尝试将两者结合起来形成 I 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>

【问题讨论】:

  • 问题可能出在您的编辑器模板中。你能显示它的标记吗?
  • 您没有提出问题,请尝试再次阅读您的帖子。但我可以肯定地说,路径错误中的非法参数与 Concat 调用无关。
  • 您的 IEnumerable 泛型使用 Address 类,但您的编辑器模板使用 AddressRecords 类型的类。这是一个错字吗?你是说如果你只是设置 AllAddresses = AddressSet1 而不是 concat 调用它可以工作吗?
  • 是的,如果我设置 set AllAddresses = AddressSet1,那么它可以工作,但我需要将两者结合起来
  • 您的 .cshtml 文件中是否有 @using System.Linq。听起来那是你的问题。我认为您错误地使用了 String.Concat

标签: asp.net-mvc-3 c#-4.0 razor


【解决方案1】:

我测试了您的问题并遇到了同样的问题。

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() 可以解决您的问题。

return View(concat.ToList());

【讨论】:

  • 只是为了扩展这一点。似乎在尝试猜测适当的模板时,MVC 正在查看您的可枚举的实际运行时类型。 Concat(以及几乎所有其他 LINQ 函数)依赖于私有通用运行时类型,其中包含“”字符,这些字符在文件路径中当然是非法的。不幸的是,似乎唯一的解决方法是通过显式迭代可枚举来绕过模板推理逻辑。
  • @PhilDegenhardt:这是否意味着@foreach 语法应该有效而@Html.EditorFor 语法不应该有效?由于ToList 有效,它似乎是迭代器本身特有的东西,而不是使用泛型。
  • 同意。当我说“显式迭代”时,我的意思是我希望 @foreach 能够工作。但是,IIRC,这会导致 EditorFor() 出现其他问题。
  • 我最终解决了一个类似的问题,使用.ToList()。在stackoverflow.com/a/27800743/498403 上查看我的其他答案。
【解决方案2】:

如果您想使用编辑器模板,为什么要编写 foreach 循环?你根本不需要这个循环。只需编写以下内容并摆脱foreach

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

然后你显然会有一个相应的编辑器模板,ASP.NET MVC 会自动为AllAddresses 集合的每个元素呈现,这样你就不需要在你的视图中编写任何 foreach 循环 (~/Views/Shared/EditorTemplates/Address.cshtml) :

@model Address
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    相关资源
    最近更新 更多