2013-02-27 74 views
0

我有一个“技能”列表,我希望用户能够通过,从列表中选择适当的级别。所以技能看起来是这样的:如何在视图中创建多个模型?最好使用部分视图和动态数量的模型

public class Skill 
{ 
    public String SkillName { get; set; } 
    public SkillLevel CurrentSkillLevel { get; set; } 
    public Boolean IsRequired { get; set; } 

    public Skill(String Name) 
    { 
     this.SkillName = Name; 
     this.IsRequired = true; 
     this.CurrentSkillLevel = SkillLevel.None; 
    } 
} 

可能有数百个技能 - 和确切人数不明的时刻,当然它必须是动态的,所以我不想让用户去通过点击每项技能,填写表格并每次提交。我想在同一页面显示所有技能(每行一行),允许用户选择所有值,然后在最后单击提交一次。

不幸的是,我已经没有使用MVC比单身创建的任何其他任何经验。我通常会为几个捆绑在一起的模型使用单独的ViewModel,但我不明白这是如何与动态列表一起工作的,并且由于它们都是相同的类型(“Skill”),我猜ViewModel看起来完全像模型的列表。

没有人有一个合适的解决方案?

感谢

上DaveA的回答
+0

我真的不知道如何绑定这个。清楚地递归被要求。但是,如何维持这种关系......我很挣扎。答案我给了简单数组的作品... – 2013-03-12 03:28:48

回答

1

大厦,您可以使用编辑器模板技能。您需要将一个名为EditorTemplates的文件夹添加到您的Views\Controller文件夹中。现在,请叫Skill.cshtml该文件夹中的局部视图,看起来像这样

@model Skill 

@Html.TextBoxFor(s => s.SkillName) 
@Html.TextBoxFor(s => s.Skills[i].Title) 
// etc... 

现在,在你的主视图

using (Html.BeginForm("UpdateCart", "Orders")) 
{ 

    @Html.TextBoxFor(p=>p.Name) 
    @Html.TextBoxFor(p=>p.Title) 

    @Html.EditorFor(p => p.Skills) 
} 

剃刀是足够聪明,它会使用技能呈现每个技能在Skills。 cshtml编辑器模板。

+0

我喜欢这个实现 – 2013-02-27 22:14:18

+0

我可以只检查这些文件的放置位置吗?我有一个名为“Skill”的控制器,所以我现在拥有Views/Skill/EditorTemplates/Skills.cshtml。该模板似乎不包括使用行@ Html.EditorFor(p => p.Skills)。有没有需要检查的设置(例如是否使用Razor)?对不起,如果这是一个新手问题!并感谢您的帮助。 – user1711233 2013-02-28 10:00:29

+0

MVC中有许多看起来像魔术的东西。它会看到“技能”是一个“IEnumerable ”,因此它将在EditorTemplates文件夹中查找名称为Skill.cshtml或“@model Skill”的文件,我不记得是哪一个。另外请注意,文件名应该是'Skill.cshtml',而不是'Skills.cshtml'。我会更新我的答案。 – cadrell0 2013-02-28 14:25:29