Asp.net-Mvc

Telerik MVC Grid 列定義中的“EditorViewData”是什麼?

  • January 24, 2014

我有一個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);
}

顯然,在這個例子中還有很多其他的東西(我希望我留下了足夠的程式碼讓它變得有意義),但它應該跨越需要它的點——而且它確實是需要的。

享受。

引用自:https://stackoverflow.com/questions/12951110