C#、MVC4、jQuery を使用しています。私に与えられた要件は、ビューの編集可能なフィールドに変換されるデータベースにレコードを追加できる必要があるということです。
ビューには、データベースの内容に応じて入力する必要があるタブ、グループ、行、および項目があります。「タブ」のリストを含むビューモデルを使用して、私が望むものを達成することができました。各タブには「グループ」のリストが含まれています。各グループには「行」のリストが含まれ、各行には「アイテム」のリストが含まれます。
最終的に私に起こったことは、エディターとまったく同じコードをたくさん繰り返す必要があるということです。これは私が避けたいことです。
したがって、私の見解では、次のようなものがあります。
@for (int tabIndex = 0; Model.Tabs != null && tabIndex < Model.Tabs.Count; tabIndex++)
{
<div id="tab-@Model.Tabs[tabIndex].TabID" class="tab-content">
@for (int groupIndex = 0; Model.Tabs[tabIndex].Groups != null && groupIndex < Model.Tabs[tabIndex].Groups.Count; groupIndex++)
{
<legend>@Model.Tabs[tabIndex].Groups[groupIndex].Name</legend>
//This is the part that is not working but I would like to
AddEditorsForGroup(tabIndex, groupIndex);
...
...
そして、私はこれもビューに持っています:
@{
public void AddEditorsForGroup(int TabIndex, int GroupIndex)
{
for (int lineIndex = 0; Model.Tabs[TabIndex].Groups[GroupIndex].Lines != null && lineIndex < Model.Tabs[TabIndex].Groups[GroupIndex].Lines.Count; lineIndex++)
{
for (int itemIndex = 0; Model.Tabs[TabIndex].Groups[GroupIndex].Lines[lineIndex].Items != null && itemIndex < Model.Tabs[TabIndex].Groups[GroupIndex].Lines[lineIndex].Items.Count; itemIndex++)
{
AddLabelAndEditor(TabIndex, GroupIndex, lineIndex, itemIndex);
}
}
}
public void AddLabelAndEditor(int TabIndex, int GroupIndex, int LineIndex, int ItemIndex)
{
<div class="_20">
<p>
switch (Model.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].DisplayTypeEdit.ToLower().Replace(" ", string.Empty))
{
case "checkbox":
Html.LabelFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueBoolean, Model.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].Name);
Html.CheckBoxFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueBoolean);
break;
case "dropdownlist":
Html.LabelFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString, Model.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].Name);
Html.DropDownListFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString, Model.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueSelectList);
break;
case "multiselectlist":
Html.LabelFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString, Model.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].Name);
Html.DropDownListFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString, Model.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueMultiSelectList);
break;
case "radiobutton":
Html.RadioButtonFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString, Model.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString);
break;
case "textarea":
Html.LabelFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString, Model.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].Name);
Html.TextAreaFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString);
break;
default:
Html.LabelFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString, Model.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].Name);
Html.TextBoxFor(vm => vm.Tabs[TabIndex].Groups[GroupIndex].Lines[LineIndex].Items[ItemIndex].ValueString);
break;
}
</p>
</div>
}
}
ビューのいくつかの部分に含まれるコードを繰り返すと、AddLabelAndEditor
機能しますが、コードの繰り返しが多くなります。
私のViewModelの関連部分:
public List<Tab> Tabs { get; set; }
public class Tab
{
public string Name { get; set; }
public List<Group> Groups { get; set; }
}
public class Group
{
public string Name { get; set; }
public List<Line> Lines { get; set; }
}
public class Line
{
public string Name { get; set; }
public List<Item> Items { get; set; }
}
public class Item
{
public string Name { get; set; }
public string Description { get; set; }
public string DataType { get; set; }
public string DataDefaultValue { get; set; }
public string DisplayTypeEdit { get; set; }
public string ValueString { get; set; }
public bool ValueBoolean { get; set; }
public DateTime ValeDateTime { get; set; }
public decimal ValueDecimal { get; set; }
public int ValueInt { get; set; }
public MultiSelectList ValueMultiSelectList { get; set; }
public SelectList ValueSelectList { get; set; }
}
考え、アイデア、提案はありますか?ありがとう