Telerik MVC Grid中的嵌套EditorTemplates编辑弹出窗口不显示在自定义编辑模板中

问题描述:

我有一个使用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网格弹出窗口中。?

这可能是ASP.NET MVC的“通过设计”决定。它不会自动渲染嵌套复杂对象的显示和编辑器模板。我甚至有一个blog post讨论这个。

长话短说,您需要为父模型创建自定义编辑器模板。

+0

事实证明,这是他们序列化对象以使mvc网格工作的方式(已知)的副产品。总之,它打破了一些黑魔法MV3应该提供的。解决方法涉及劫持事件并通过javascript手动构建HTML表单。 –