プロパティ LookupData の適切なリストを取得するのに問題があります。フォームをポストするたびに、モデルバインダーは常にそのプロパティに対して null を返します。フォームコレクションで結果を表示すると、LookupData とそのオブジェクトが正しくインデックス付けされているように見えるので、すべてを正しく行ったと思います。
以下のように名前が付けられますが、モデル バインダーはリストを作成してプロパティにバインドし直すことを望んでいないようです。
"[2].LookupData.[0].Description",
"[2].LookupData.[0].Value",
"[2].LookupData.[1].Description",
"[2].LookupData.[1].Value" etc..
私が本当に望んでいるのは、LookupData プロパティ全体を非表示にして、フォームを投稿した後に元に戻すことだけです。
レポート パラメータ クラス:
public class ReportParameter
{
[RequiredIf("Required", true, ErrorMessage = "*")]
public string ParamValue { get; set; }
public string Name { get; set; }
public string Title { get; set; }
public string DefaultValue { get; set; }
public string CustomProperty { get; set; }
public string LookupQuery { get; set; }
public bool Enabled { get; set; }
public int MaxLength { get; set; }
public bool Required { get; set; }
public List<string> Dependence { get; set; }
public List<ILookupData> LookupData { get; set; }
public VariantType Type { get; set; }
public ReportType Destinations { get; set; }
}
LookupData クラス
public interface ILookupData
{
string Value { get; set; }
string Description { get; set; }
}
私の見解:
@model List<ReportParameter>
@section scripts{
<script>
jQuery(document).ready(function() {
$(".datepick").datepicker($.datepicker.regional["@ViewBag.LanguageCode"]);
});
</script>
}
@using (Html.BeginForm("Report", "Reports", FormMethod.Post))
{
<div id="searchpaneloptions" class="collapse in search-panel report-options">
<div class="row">
<div class="col-md-12">
<p class="pull-right lsf"><a class="close-options subtle" href="#">close</a></p>
<h2 id="options">@Metadata.Txt("Report options") <small class="option-heading">@if (ViewBag.ReportLabel != null){ @ViewBag.ReportLabel } </small></h2>
</div>
</div>
<div class="row">
@if (!Model.IsNullOrEmpty())
{
<div class="col-md-4 ">
@Html.EditorForModel()
</div>
}
</div>
<div class="clearfix space-before"></div>
</div>
}
ReportParameter の Editortemplate、@Html.EditorFor(model => model.LookupData, "Lookups") を使用する部分:
@model ReportParameter
@Html.HiddenFor(m => m.Name)
@Html.HiddenFor(m => m.Type)
@Html.HiddenFor(m => m.Title)
@Html.HiddenFor(m => m.CustomProperty)
@Html.HiddenFor(m => m.DefaultValue)
@Html.HiddenFor(m => m.Destinations)
@Html.HiddenFor(m => m.Enabled)
@Html.HiddenFor(m => m.LookupQuery)
@Html.HiddenFor(m => m.MaxLength)
@Html.HiddenFor(m => m.Required)
@Html.HiddenFor(m => m.Type)
@Html.ValidationSummary(true)
@{
Model.Dependence = new List<string>(){"aaa","3222","123"}; //testing string list, same problem here
}
@if (!Model.Dependence.IsNullOrEmpty())
{
@Html.EditorFor(model => model.Dependence,"Lookups2")//testing string list, same problem here
}
@if (Model.Required)
{
@Html.ValidationMessageFor(m => m.ParamValue, "*")
}
@if (Model.Type == VariantType.VT_Datetime || Model.Type == VariantType.VT_Date)
{
@Html.LabelFor(m => m.Name, Model.Title, new { @class = "xcol-lg-4 control-label" })
@Html.TextBoxFor(m => m.ParamValue, new { @class = "form-control input-lg datepick" })
}
else if (Model.Name != "destinationoptions")
{
@Html.LabelFor(m => m.Name, Model.Title, new { @class = "xcol-lg-4 control-label" })
if (Model.LookupData.IsNullOrEmpty())
{
@Html.TextBoxFor(m => m.ParamValue, new { @class = "form-control input-lg" })
}
else
{
@Html.DropDownListFor(model => model.ParamValue, Model.LookupData.ToSelectListItems(Model.ParamValue ?? Model.DefaultValue ?? ""))
@Html.EditorFor(model => model.LookupData, "Lookups")
}
}
lookupdata プロパティのエディタ テンプレート
@model List<ILookupData>
@for (int i = 0; i < Model.Count; i++) {
@Html.EditorFor(m => m[i],"Lookup")
}
ルックアップデータ リストの項目のエディター テンプレート
@model ILookupData
@Html.HiddenFor(m => m.Description)
@Html.HiddenFor(m => m.Value)