ページに適切に定義されたモデルがある場合は、ViewBag または ViewData を使用する必要はありません。EditorViewData を使用すると、オンザフライで ViewData を作成して、追加のデータを EditorTemplate に渡すことができます。
たとえば、グリッド内の各アイテムの EditorTemplate に異なる DropDownList 値を設定したい場合、これを行うには追加のデータを渡す必要があります。EditorViewData を使用すると、コントローラーで ViewBag または ViewData オブジェクトをコーディングする必要なく、まさにその目的のためにモデルから追加の値を追加できます。
私が最初に使用した場所は、ネストされた TabStrip 内の資格グリッドに追加された定義済みの資格を編集できる人物グリッドでした。秘訣は、各人の DropDownList に、すでに獲得した資格を含めたくないということでした。このような...
ピープルグリッド
@using Kendo.Mvc.UI
@model PeopleViewModel
@(Html.Kendo().Grid<PersonModel>()
.Name("PersonGrid")
.Columns(columns => {
columns.Bound(b => b.LastName).EditorTemplateName("_TextBox50");
columns.Bound(b => b.FirstName).EditorTemplateName("_TextBox50");
...
columns.Command(cmd => { cmd.Edit(); cmd.Destroy(); }).Width(180);
})
.ClientDetailTemplateId("personTemplate")
.ToolBar(toolbar => toolbar.Create())
.Selectable()
.Editable(editable => editable.Mode(GridEditMode.InLine))
.DataSource(dataSource => dataSource
.Ajax()
.Model(model =>
{
model.Id(a => a.Id);
})
.Create(create => create.Action("CreatePerson", "People"))
.Read(read => read.Action("ReadPeople", "People"))
.Update(update => update.Action("UpdatePerson", "People"))
.Destroy(destroy => destroy.Action("DestroyPerson", "People"))
)
.Events(events => events.DataBound("dataBound"))
)
<script type="text/javascript">
function dataBound() {
this.expandRow(this.tbody.find("tr.k-master-row").first());
}
</script>
<script id="personTemplate" type="text/kendo-tmpl">
@(Html.Kendo().TabStrip()
.Name("TabStrip_#=Id#")
.Items(items =>
{
...
items.Add().Text("Edit Qualifications")
.LoadContentFrom("PersonQualifications", "People", new {personId = "#=Id#"});
...
})
.ToClientTemplate()
)
</script>
PeopleViewModel
継承のことは無視してください。それはこの議論の範囲を超えています。ただし、このトップ レベル ビューに関連するすべてのサブ ビューで同じモデルを使用していることに注意してください。
public class PeopleViewModel : PageViewModel
{
public int PersonId { get; set; }
public PersonModel Person { get; set; }
public IList<QualificationModel> AllQualifications { get; set; }
...
public PeopleViewModel(BaseViewModel baseViewModel) : base(baseViewModel)
{}
}
PersonQualifications コントローラー
データ プロバイダーは別の場所に挿入されますが、POCO からモデルへのフラット化に注意してください。これは、モデル コンストラクターに List を適用する単なる静的メソッドです。
public ActionResult PersonQualifications(int personId)
{
SetBaseContext(HttpContext);
var model = new PeopleViewModel(BaseViewModel)
{
PersonId = personId,
AllQualifications = QualificationModel.FlattenToThis(_qualificationDataProvider.Read())
};
return View(model);
}
ネストされたグリッド (TabStrip 内にロードされたビュー)
@using Kendo.Mvc.UI
@model PeopleViewModel
@{
Layout = null;
}
@(Html.Kendo().Grid<PersonQualificationModel>()
.Name("QualificationEditGrid_" + Model.PersonId)
.Columns(columns =>
{
columns.ForeignKey(f => f.QualificationId, Model.AllQualifications, "Id", "Display")
===> .EditorViewData(new {personId = Model.PersonId})
.EditorTemplateName("PersonQualificationDropDownList");
columns.Command(cmd =>
{
cmd.Edit();
cmd.Destroy();
}).Width(180);
})
.ToolBar(toolbar => toolbar.Create())
.DataSource(dataSource => dataSource
.Ajax()
.Events(events => events.Error("error_handler"))
.Model(model => {
model.Id(a => a.Id);
})
.Create(create => create.Action("CreatePersonQualification", "People"))
.Read(read => read.Action("ReadPersonQualifications", "People", new {personId = Model.PersonId}))
.Destroy(destroy => destroy.Action("DestroyPersonQualification", "People"))
)
)
EditorTemplate (ついに!)
この EditorTemplate を共有するのに役立つ最初の ViewData 参照を無視します。私たちが興味を持っているのはもう少し下です。
@using Kendo.Mvc.UI
@(Html.Kendo().DropDownList()
.Name(ViewData.TemplateInfo.GetFullHtmlFieldName(""))
.DataValueField("Id")
.DataTextField("Name")
.OptionLabel("Select...")
.DataSource(dataSource => dataSource
===> .Read(read => read.Action("ReadDdlQualifications", "People", new {personId = ViewData["personId"]}))
)
)
コントローラーメソッド(念のため)
public JsonResult ReadDdlQualifications(int personId)
{
var qualification = _qualificationDataProvider.ReadAvailableToPerson(personId);
IList<IdNamePair> results = IdNamePair.FlattenToThis(qualification);
return Json(results, JsonRequestBehavior.AllowGet);
}
明らかに、この例では他にも多くのことが行われています (意味をなすために十分なコードを残しておけばよかったと思います)。
楽しみ。