Asp.net mvc 在MVC Razor视图中显示选项层次结构的最佳方法
我必须创建一个表单,向用户呈现选项的层次结构,但我似乎无法正确获取它 因此,如果我有以下父子关系(级别是显示项目的阶段):Asp.net mvc 在MVC Razor视图中显示选项层次结构的最佳方法,asp.net-mvc,forms,razor,Asp.net Mvc,Forms,Razor,我必须创建一个表单,向用户呈现选项的层次结构,但我似乎无法正确获取它 因此,如果我有以下父子关系(级别是显示项目的阶段): 选项1(1级) 选项3(2级) 选项16(第4级) 选择17(第4级) 选项18(第4级) 选项4(第2级) 选项11(第3级) 选择12(第3级) 选项5(第2级) 选项13(第3级) 选择14(第3级) 选项15(第3级) 选项2(1级) 选项6(第2级) 选项7(第2级) 选项8(第3级) 选项9(第3级) 选项10(第3级) 选项19(第5级)
- 选项1(1级)
- 选项3(2级)
- 选项16(第4级)
- 选择17(第4级)
- 选项18(第4级)
- 选项4(第2级)
- 选项11(第3级)
- 选择12(第3级)
- 选项5(第2级)
- 选项13(第3级)
- 选择14(第3级)
- 选项15(第3级)
- 选项3(2级)
- 选项2(1级)
- 选项6(第2级)
- 选项7(第2级)
- 选项8(第3级)
- 选项9(第3级)
- 选项10(第3级)
- 选项19(第5级)
- 选项20(第5级)
@using (Html.BeginForm())
{
int prevLevel = 0;
foreach (var option in Model.Options)
{
//close previous Div if we are starting a new level and we are not at the start
if (option.LevelId != prevLevel && Model.Options.IndexOf(option) != 0)
{
@:</div>
@:<div class="option-section" id="Level@(option.LevelId)">
}
else if(Model.Options.IndexOf(option) == 0)//This should only occur at the start
{
@:<div class="option-section" id="Level@(option.LevelId)">
}
@Html.RadioButton("OptionIds[" + (option.LevelId - 1) + "]", option.OptionId, false, new { parent = option.ParentOptionId })
@option.OptionName
prevLevel = option.LevelId;
}
<div class="buttons">
<input type="submit" value="Continue" class="button" />
</div>
}
@使用(Html.BeginForm())
{
int-prevLevel=0;
foreach(Model.Options中的var选项)
{
//如果我们正在开始一个新的级别,而我们还没有开始,请关闭上一个Div
if(option.LevelId!=prevLevel&&Model.Options.IndexOf(option)!=0)
{
@:
@:
}
else if(Model.Options.IndexOf(option)==0)//这应该只在开始时发生
{
@:
}
@RadioButton(“OptionId[”+(option.LevelId-1)+“]”,option.OptionId,false,新建{parent=option.ParentOptionId})
@option.OptionName
prevLevel=option.LevelId;
}
}
我的输出如下(从实际的html输出):
抱歉,无法在编辑器中正确显示我的代码
好的,我想我已经解决了。我创建了一个名为OptionLevel的新实体。用我的级别和每个级别的可用选项填充它。这使我能够迭代各个级别,从而遍历每个级别中的选项
@using (Html.BeginForm())
{
foreach (var Level in Model.Levels)
{
@:<div class="level" id="Level@(Level.LevelId)">
foreach (var option in Level.Options)
{
@:<div class="option" id="Parent@(option.ParentOptionId)">
@Html.RadioButton("OptionIds[" + (option.LevelId - 1) + "]-",
option.OptionId,
false, new { parent = option.ParentOptionId }
)
@option.OptionName
@:</div>
}
@:</div>
}
<div class="buttons">
<input type="submit" value="Continue" class="button" />
</div>
}
@使用(Html.BeginForm())
{
foreach(Model.Levels中的var级别)
{
@:
foreach(Level.Options中的var选项)
{
@:
@RadioButton(“optionId[”+(option.LevelId-1)+“]-”,
option.OptionId,
false,新建{parent=option.ParentOptionId}
)
@option.OptionName
@:
}
@:
}
}
我仍然需要找出如何根据上一级中的上一个选择选项显示和隐藏正确的选项。这也可以通过多个下拉框来完成。仅当选择第一个框时才填充第二个框的内容,使用该选择值查询下一个框的数据。我想我可能已经找到了答案。我认为我应该做的是使用Levels类,它包含每个级别的所有选项。我将尝试一下,如果它有效的话,我会更新这个。对我的ID的使用吹毛求疵。据我所知,我应该只使用一次ID。但是,在本例中,我使用ID来帮助选择要显示的选项。有人知道更好的方法吗?想更新这个,因为我找到了更好的方法,那就是使用模板。使用正确的模型(即OptionLevels vs Options)仍然可以解决我的问题。然而,使用模板可以提供更清晰的代码。例如,见。