Asp.net-Mvc
Telerik MVC Grid 列定義中的“EditorViewData”是什麼?
我有一個telerik網格如下:
Html.Telerik().Grid<MatchViewModel>().Name("Matches").Columns(cols => { cols.Bound(e => e.Name); cols.Bound(e => e.Date); cols.Bound(e => e.GuestTeamId); cols.Bound(e => e.HostTeamId); cols.Bound(e => e.PostponedDate); ==> cols.Bound(e => e.RefereeId).EditorViewData(new { RefereeName = '' }); cols.Bound(e => e.StatusId); })在箭頭所指的列中,我想將裁判名稱作為 EditorTemplate 的附加數據發送。我從
EditorViewData方法名稱推斷它可以幫助我這樣做。但我無法讓它工作。有人可以幫我嗎?謝謝。
如果您的頁面有一個定義明確的模型,那麼您永遠不需要使用 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>人員視圖模型
忽略繼承的東西,它超出了這個討論。但請注意,我在與此頂級視圖相關的所有子視圖上使用相同的模型。
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) {} }人員資格控制員
數據提供者在其他地方注入,但請注意模型展平的 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 的第一個 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); }顯然,在這個例子中還有很多其他的東西(我希望我留下了足夠的程式碼讓它變得有意義),但它應該跨越需要它的點——而且它確實是需要的。
享受。