Вложенные EditorTemplates в Telerik MVC Всплывающее окно редактирования сетки не отображается в пользовательском шаблоне редактирования - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть сетка, использующая AJAX DATABINDING. Когда я выполняю команду РЕДАКТИРОВАНИЯ POPUP с УКАЗАННЫМ 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>
    {
    }
}

My View

@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 / 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, которые предшествуют сетке, фильтруют вплоть до пользовательского редактора EditorTemplate, как и ожидалось. Кроме того, мы можем видеть, что данные роли находятся в таблице, поскольку они отображаются в столбце роли.

Но нажмите на окно редактирования, и вот результат:

enter image description here

Как видно, шаблон UserRoles не заполняется ролями в свойстве UserRoles редактируемой нами TemplateTesterModel.

Я что-то упустил? Почему свойство .UserRoles не заполняется во всплывающем окне сетки Telerik .?

1 Ответ

0 голосов
/ 25 октября 2011

Это может быть «конструктивное» решение ASP.NET MVC.Он не отображает автоматически шаблоны отображения и редактирования для вложенных сложных объектов.У меня даже есть сообщение в блоге , где обсуждается это.

Короче говоря, вам нужно создать собственный шаблон редактора для родительской модели.

...