2011-09-28 53 views
0

我有一個使用AJAX DATABINDING的網格。 當我使用TEMPLATENAME SPECIFIED發出POPUP EDITING命令時,我的嵌套編輯器模板沒有填充。Telerik MVC Grid中的嵌套EditorTemplates編輯彈出窗口不顯示在自定義編輯模板中

我的模型

namespace eGate.BackOffice.WebClient.Model 
{ 
    public class TemplateTesterModel 
    { 
     public int TemplateModelId { get; set; } 
     public string TemplateModelName { get; set; } 
     public List<UserRole> UserRoles { get; set; } 
    } 
} 



{ 
    public class TemplateTesterModels : List<TemplateTesterModel> 
    { 
    } 
} 

我的視圖

@model eGate.BackOffice.WebClient.Model.TemplateTesterModels     
@Html.EditorFor(m=>m) 

@(Html.Telerik().Grid<eGate.BackOffice.WebClient.Model.TemplateTesterModel>() 
     .Name("Grid") 
     .DataKeys(keys => { keys.Add(m=>m.TemplateModelId); }) 
     .Columns(columns => 
     { 
      columns.Bound(o => o.TemplateModelId); 
      columns.Bound(o => o.TemplateModelName).Width(200); 
      columns.Bound(o => o.UserRoles).ClientTemplate(
               "<# for (var i = 0; i < UserRoles.length; i++) {" + 
               "#> <#= UserRoles[i].RoleName #> <#" + 
               "} #>") 
               ; 
      columns.Command(commands => 
      { 
       commands.Edit().ButtonType(GridButtonType.Text); 
      }).Width(180).Title("Commands"); 
     }) 
     .DataBinding(dataBinding => dataBinding.Ajax() 
         .Select("_SelectAjaxEditing", "TemplateTester") 
         .Insert("_InsertAjaxEditing", "Grid") 
         .Update("_SaveAjaxEditing", "TemplateTester") 
         .Delete("_DeleteAjaxEditing", "TemplateTester") 
        ) 

     .Editable(editable => editable.Mode(GridEditMode.PopUp).TemplateName("TemplateTesterModel")) 
) 

我的控制器

namespace eGate.BackOffice.WebClient.Controllers 
{ 
    public class TemplateTesterController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(GetTemplateTesters()); 
      //return View(new GridModel(GetTemplateTesters())); 
     } 
     private TemplateTesterModels GetTemplateTesters() { 

      TemplateTesterModels returnme = new TemplateTesterModels(); 
      returnme.Add(new TemplateTesterModel()); 
      returnme[0].TemplateModelId = 0; 
      returnme[0].TemplateModelName = "Template Tester 0"; 
      returnme[0].UserRoles = new List<UserRole>(); 
      returnme[0].UserRoles.Add(new UserRole() { RoleName = "Role1", IsChecked = true, Description = "Role for 1" }); 
      returnme[0].UserRoles.Add(new UserRole() { RoleName = "Role2", IsChecked = false, Description = "Role for 2" }); 
      returnme[0].UserRoles.Add(new UserRole() { RoleName = "Role3", IsChecked = false, Description = "Role for 3" }); 
      return returnme; 
     } 
     [GridAction] 
     public ActionResult _SelectAjaxEditing() 
     { 
      return View(new GridModel(GetTemplateTesters())); 
     } 
     [AcceptVerbs(HttpVerbs.Post)] 
     [GridAction] 
     public ActionResult _SaveAjaxEditing(int id) 
     { 
      return View(new GridModel(GetTemplateTesters())); 
     } 
     [GridAction] 
     public ActionResult _InsertAjaxEditing(){ 
      return View(new GridModel(GetTemplateTesters())); 
     } 
     [AcceptVerbs(HttpVerbs.Post)] 
     [GridAction] 
     public ActionResult _DeleteAjaxEditing(int id) 
     { 
      return View(new GridModel(GetTemplateTesters())); 
     } 


    } 
} 

我EditorTemplates 共享/ EditorTemplates/TemplateTesterModel.cshtml

@model eGate.BackOffice.WebClient.Model.TemplateTesterModel 
<div>TemplateTesterModel Editor</div> 
<div>@Html.EditorFor(m=>m.TemplateModelId)</div> 
<div>@Html.EditorFor(m=>m.TemplateModelName)</div> 
<div>Roles</div> 
<div>@Html.EditorFor(m=>m.UserRoles)</div> 

共享/ EditorTemplates/UserRole.cshtml

@model eGate.BackOffice.WebClient.Model.UserRole 

<div> 
I can has user role? 
@Html.CheckBoxFor(m=>m.IsChecked) 
</div> 

這使得出這樣:

enter image description here

正如你可以看到,通過下調之前電網濾波器的@ Html.EditFor聲明到預期的userrole EditorTemplate。此外,我們可以看到角色數據位於網格中,因爲它顯示在角色列中。

但點擊編輯窗口,這就是結果:

enter image description here

正如你可以看到模板的UserRole不與我們編輯TemplateTesterModel的財產的UserRole角色填充。

我錯過了什麼嗎?爲什麼.UserRoles屬性未填充到telerik網格彈出窗口中。?

回答

0

這可能是ASP.NET MVC的「通過設計」決定。它不會自動渲染嵌套複雜對象的顯示和編輯器模板。我甚至有一個blog post討論這個。

長話短說,您需要爲父模型創建自定義編輯器模板。

+0

事實證明,這是他們序列化對象以使mvc網格工作的方式(已知)的副產品。總之,它打破了一些黑魔法MV3應該提供的。解決方法涉及劫持事件並通過javascript手動構建HTML表單。 –

相關問題