asp.net - 在 ASP.NET MVC 中将集合传递给 EditorFor

标签 asp.net asp.net-mvc razor editorfor

我有一个很长的表格,我已经把它分成了几个部分,每个部分都使用 @Html.EditorFor ,这很好用,但需要你考虑一下这种方法是否可以改进。

有段,每个段可以有多个事件,所以我有一个段的集合,这个集合中的每个段都包含一个事件的集合。

    public class Activity
    {
        public string ActivityId { get; set; }
        public string ActivityDescription { get; set; }
        public bool IsSelected { get; set; }
    }
    public class Segment
    {
        public string SegmentId { get; set; }
        public string SegmentDescription { get; set; }
        public List<Activity> Activitites { get; set; }
    }

这就是我希望用作 View 模型的 ViewModel 的样子,但无法使其工作,因为 @Html.EditorFor 不接受集合类型。
    public class UserPreferencesViewModel
   {
       //..... Other Properties
       public List<Segment> Segments {get; set;}
   }

这是 View 模型
@model UserPreferencesViewModel
@{
   //... Other Properties
   @Html.EditorFor(m => m.Segments) //I assigned Segments three Segments in the Controller Get Method
}

这是段的 EditorFor 模板
@model List<Segment>
@{
   //... Other Properties
   @foreach(var segment in Model)
   {
      //Do the stuff
   }
}

但这并不能说明 EditorFor 不能接受集合并且在运行时抛出异常。

这是我的工作。我创建了另一个包含 Segment Collection 的类“UglySegmentWorkAround”,然后在 UserPreferencesViewModel 中删除了 List 属性,而是为其定义了一个属性。
public class UglySegmentWorkAround
{
public List<Segment> Segments {get; set;}
}

public class UserPreferencesViewModel
       {
           //..... Other Properties
           public UglySegmentWorkAround UglySegmentWorkAround {get; set;}
       }

这是 EditorFor 模板。
@model UglySegmentWorkAround
    @{
       //... Other Properties
       @foreach(var segments in Model.Segments)
       {
          //Do the stuff
       }
    }

它工作得很好,但我对这种方法感到不舒服,我在第一种方法中遗漏了什么吗?这应该怎么做?如果我将一个集合传递给它,我不希望 EditorFor 执行隐式循环,因为我在 EditorFor 中呈现复杂的 UI 结构,并且我需要 EditorFor 在其中包含循环。

最佳答案

EditorFor 旨在为您迭代集合。它会自动执行此操作。当您将一个集合传递到 EditorFor 时,它会自动为集合中的每个项目调用您的模板。

如果您需要为整个集合设置一些渲染,那么您应该在 EditorFor 调用之外执行此操作,无论是在您的 View 代码中,还是在调用您的 EditorFor 的部分 View 中。

例如,如果你想把你的代码放在一个表中,你可以这样做(其中 MyCollection 是 List<MyItem> ):

_MyCollectionPartial.cshtml

<table>
    <tr>
       <th>Foo...</th>
       ...
     <tr>
     @Html.EditorFor(x => x.MyCollection)
</table>

/Views/Shared/EditorTemplates/MyItem.cshtml
@model MyItem
<tr>
    <td>@Html.TextBox(x => x.Foo)</td>
    ....
</tr>

编辑:

也许更好的方法是使用编辑器模板的一个鲜为人知且文档不足的“功能”。这个“特性”是,如果你指定一个模板名称作为参数,那么它不会遍历集合。您可以使用此表单来“包装”您的收藏项模板。

/主页/Index.cshtml
.... your html
@Html.EditorFor(model => model.MyCollection, "MyCollectionLayout")

/Views/Shared/EditorTemplates/MyCollectionLayout.cshtml
@model List<MyItem>
<table>
    <tr>
       <th>Foo...</th>
       ...
     <tr>
     @Html.EditorForModel() (Or alternatively @Html.EditorFor(model => model)
 </table>

/Views/Shared/EditorTemplates/MyItem.cshtml
@model MyItem
<tr>
    <td>@Html.TextBoxFor(x => x.Foo)</td>
    ....
</tr>

注意:我说“功能”是因为这在 SO 上产生了很多关于它在参数中明确指定模板名称时不迭代集合的问题)

关于asp.net - 在 ASP.NET MVC 中将集合传递给 EditorFor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26068640/

相关文章:

c# - 在c#中获取dll程序集的静态文件

c# - 在 ASP .NET MVC 中为静态资源启用 CORS?

asp.net-mvc - ASP.NET MVC session 、全局和缓存

c# - 在 MVC 4 Razor View 中引用外部 dll

c# - 将模型传递给部分时出现类型转换错误

c# - 当它在asp.net中没有图像时如何使图像框不可见

javascript - Googles 的二维码生成 api 不起作用

asp.net - 如何从 iOS 设备上传或发送照片到网络服务器

c# - 在 MVC 区域中时出现导航问题

javascript - 自动完成关闭在 Chrome 中不起作用