Asp.net mvc 3 Telerik MVC网格编辑弹出窗口中的嵌套编辑器模板未显示在自定义编辑模板中

Asp.net mvc 3 Telerik MVC网格编辑弹出窗口中的嵌套编辑器模板未显示在自定义编辑模板中,asp.net-mvc-3,telerik-mvc,mvc-editor-templates,Asp.net Mvc 3,Telerik Mvc,Mvc Editor Templates,我有一个使用AJAX数据绑定的网格。 当我使用指定的TEMPLATENAME发出弹出式编辑命令时,嵌套编辑器模板不会填充 我的模型 namespace eGate.BackOffice.WebClient.Model { public class TemplateTesterModel { public int TemplateModelId { get; set; } public string TemplateModelName { get;

我有一个使用AJAX数据绑定的网格。 当我使用指定的TEMPLATENAME发出弹出式编辑命令时,嵌套编辑器模板不会填充

我的模型

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>
    {
    }
}
命名空间eGate.BackOffice.WebClient.Model
{
公共类TemplateTesterModel
{
public int TemplateModelId{get;set;}
公共字符串TemplateModelName{get;set;}
公共列表用户角色{get;set;}
}
}
{
公共类TemplateTesterModels:列表
{
}
}
我的看法

@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"))
)
@model eGate.BackOffice.WebClient.model.TemplateTesterModels
@EditorFor(m=>m)
@(Html.Telerik().Grid())
.名称(“网格”)
.DataKeys(keys=>{keys.Add(m=>m.TemplateModelId);})
.列(列=>
{
columns.Bound(o=>o.TemplateModelId);
columns.Bound(o=>o.TemplateModelName).Width(200);
columns.Bound(o=>o.UserRoles).ClientTemplate(
"   ")
;
columns.Command(commands=>
{
commands.Edit().ButtonType(GridButtonType.Text);
}).宽度(180)。标题(“命令”);
})
.DataBinding(DataBinding=>DataBinding.Ajax()
.选择(“\u SelectAjaxEditing”,“TemplateTester”)
.Insert(“\u inserta”,“Grid”)
.Update(“\u SaveAjaxEditing”,“TemplateTester”)
.Delete(“\u 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()));
        }


    }
}
命名空间eGate.BackOffice.WebClient.Controllers
{
公共类TemplateTesterController:控制器
{
公共行动结果索引()
{
返回视图(GetTemplateTesters());
//返回视图(新的GridModel(GetTemplateTesters());
}
私有TemplateTester模型GetTemplateTesters(){
TemplateTesterModels returnme=新TemplateTesterModels();
Add(newtemplateTesterModel());
returnme[0]。TemplateModelId=0;
returnme[0]。TemplateModelName=“模板测试仪0”;
returnme[0]。UserRoles=新列表();
returnme[0].UserRoles.Add(新的UserRole(){RoleName=“Role1”,IsChecked=true,Description=“Role for 1”});
returnme[0].UserRoles.Add(新的UserRole(){RoleName=“Role2”,IsChecked=false,Description=“Role for 2”});
returnme[0].UserRoles.Add(new UserRole(){RoleName=“Role3”,IsChecked=false,Description=“Role for 3”});
还给我;
}
[行动]
公共行动结果(u SelectAjaxEditing)
{
返回视图(新的GridModel(GetTemplateTesters());
}
[接受动词(HttpVerbs.Post)]
[行动]
公共操作结果\u SaveAjaxEditing(int-id)
{
返回视图(新的GridModel(GetTemplateTesters());
}
[行动]
公共行动结果_InsertAjaxEditing(){
返回视图(新的GridModel(GetTemplateTesters());
}
[接受动词(HttpVerbs.Post)]
[行动]
公共行动结果_DeleteAjaxEditing(int id)
{
返回视图(新的GridModel(GetTemplateTesters());
}
}
}
我的编辑模板 共享/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>
@model eGate.BackOffice.WebClient.model.TemplateTesterModel
TemplateTesterModel编辑器
@EditorFor(m=>m.TemplateModelId)
@EditorFor(m=>m.TemplateModelName)
角色
@EditorFor(m=>m.UserRoles)
共享/EditorTemplates/UserRole.cshtml

@model eGate.BackOffice.WebClient.Model.UserRole

<div>
I can has user role?
@Html.CheckBoxFor(m=>m.IsChecked)
</div>
@model eGate.BackOffice.WebClient.model.UserRole
我可以拥有用户角色吗?
@Html.CheckBoxFor(m=>m.IsChecked)
这表现为:

正如您所看到的那样,网格过滤器之前的@Html.EditFor语句会按预期向下传递到userrole EditorTemplate。此外,我们可以看到角色数据在网格中,因为它显示在角色列中

但单击编辑窗口,结果如下:

如您所见,UserRoles模板没有填充我们正在编辑的TemplateTesterModel的UserRoles属性上的角色

我错过什么了吗?为什么没有在telerik网格弹出窗口中填充.UserRoles属性?

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

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

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