2011-05-15 2 views
0

OK ... J'ai passé trop de temps à patauger sur celui-ci, donc je le passe aux experts -> VOUS. Ma page ASP.NET MVC (v3 avec Razor View Engine) TRES simple utilise un contrôle Telerik Rad Grid pour afficher certaines listes de types, puis j'ai les codes associés dans la DetailsView de la grille.Telerik Rad Grid sur le moteur de vue ASP.NET MVC Razor - DetailView pas peupler initialement

Faire la population est facile. J'ai un ViewModel pour mon type TypeCodeList et l'envoie à la vue fortement typée pour peupler la grille. Cela fonctionne très bien ... et la grille est superbe - merci Telerik. Cependant, j'ai ajouté DetailsView pour remplir ensuite les TypeCodes enfants de la même manière. La mauvaise chose est que lorsque ma grille se remplit, je sélectionne le triangle sur la gauche pour développer l'arbre et voir les enregistrements enfant, rien n'est là. MAIS, si je sélectionne le bouton "Actualiser" sur le bas de la grille, alors je peux frapper le triangle et l'affichage des dossiers de l'enfant. Donc (en résumé), les enregistrements enfants ne s'affichent pas sur la charge initiale.

Ce n'est que lorsque je sélectionne un rafraîchissement AJAX de la grille que je reçois les enfants. Sinon, cela fonctionne comme requis.

J'ai essayé de voir si je pouvais lancer par programmation javascrip lors du chargement de la page. OU si je peux obtenir la chose à remplir par lui-même lorsqu'il est sélectionné sans faire un rafraîchissement d'abord - ce serait préférable.

Ci-dessous est mon code:

contrôleur Pertinent code (je l'ai fait sortir la mise à jour, supprimer, insérer des méthodes d'accès exploitation forestière et de données)

[HandleErrorWithElmah] 
public partial class HostController : Controller 
{ 

    /// <summary> 
    /// Index - Home for HostController 
    /// </summary> 
    /// <returns></returns> 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    #region Type List Section 

    /// <summary> 
    /// Gets the list of TypeLists - yea...say that again 
    /// </summary> 
    [GridAction] 
    public ActionResult TypeCodeList() 
    { 

     var model = GetActiveTypeLists(); 

     // Get all of the type lists and send them to the view 
     return View(model); 

    } 


    /// <summary> 
    /// The ajaxified Select 
    /// </summary> 
    /// <returns></returns> 
    [AcceptVerbs(HttpVerbs.Post)] 
    [GridAction] 
    public ActionResult _TypeCodeList() 
    { 

     var model = GetActiveTypeLists(); 
     return Json(new GridModel(model)); 


    } 

    /// <summary> 
    /// Simply a wrapper to get all of the current type list values. 
    /// </summary> 
    /// <returns></returns> 
    private IEnumerable<TypeCodeListViewModel> GetActiveTypeLists() 
    { 

     var model = from p in entityRepository.Find<TypeList>(p => p.IsActive == true) 
        select new TypeCodeListViewModel 
        { 
         TypeListId = p.TypeListId, 
         Name = p.Name, 
         Description = p.Description, 
         IsActive = p.IsActive 
        }; 


     return model; 

    } 

    #endregion 

    #region Type Code Section 

    [AcceptVerbs(HttpVerbs.Post)] 
    [GridAction] 
    public ActionResult _TypeCodeForTypeListAjax(int typeListId) 
    { 
     var model = GetActiveTypeCodes(typeListId); 
     return Json(new GridModel(model)); 
    } 


    /// <summary> 
    /// Simply a wrapper to get all of the current type Code values. 
    /// </summary> 
    /// <returns></returns> 
    private IEnumerable<TypeCodeViewModel> GetAllActiveTypeCodes() 
    { 

     var model = from p in entityRepository.Find<OurLeaguePlay.Models.TypeCode>(p => p.IsActive == true).OrderBy(ord => ord.CodeName) 
        select new TypeCodeViewModel 
        { 
         TypeCodeId = p.TypeCodeId, 
         TypeListId = p.TypeListId, 
         CodeName = p.CodeName, 
         CodeValue = p.CodeValue, 
         Description = p.Description, 
         IsActive = p.IsActive 
        }; 


     return model; 

    } 


    /// <summary> 
    /// Simply a wrapper to get all of the current type Code values. 
    /// </summary> 
    /// <returns></returns> 
    private IEnumerable<TypeCodeViewModel> GetActiveTypeCodes(int typeListId) 
    { 

     var model = from p in entityRepository.Find<OurLeaguePlay.Models.TypeCode>(p => p.IsActive == true && 
                         p.TypeListId == typeListId).OrderBy(ord => ord.CodeName) 
        select new TypeCodeViewModel 
        { 
         TypeCodeId = p.TypeCodeId, 
         TypeListId = p.TypeListId, 
         CodeName = p.CodeName, 
         CodeValue = p.CodeValue, 
         Description = p.Description, 
         IsActive = p.IsActive 
        }; 


     return model; 

    } 


    #endregion 

} 

Voici mon Afficher le code: (Je l'ai fait sortir tout mon javascript a échoué les tentatives pour essayer de forcer la charge de la charge de la page)

@model IEnumerable<TypeCodeListViewModel> 
@using Telerik.Web.Mvc.UI 
@using Telerik.Web.Mvc 
@using OurLeaguePlay.ViewModels 
@{Html.Telerik().Grid<TypeCodeListViewModel>(Model) 
     .Name("TypeLists") 
     .DetailView(details => details.ClientTemplate(
      Html.Telerik().Grid<TypeCodeViewModel>() 
       .Name("TypeCode_<#= TypeListId #>") 
       .DataKeys(keys => keys.Add(k => k.TypeCodeId)) 
       .Columns(columns => 
       { 
        columns.Bound(o => o.CodeName).Width(40); 
        columns.Bound(o => o.CodeValue).ReadOnly(true).Width(40); 
        columns.Bound(o => o.Description).Width(100); 
       }) 
       .DataBinding(dataBinding => 
        { 
         dataBinding.Ajax().Select("_TypeCodeForTypeListAjax", "Host", new { typeListId = "<#= TypeListId #>" }) 
              .Enabled(true); 
        } 
        ) 
       .Pageable() 
       .Sortable() 
       .NoRecordsTemplate("No Type Codes exist for the selected Type List") 
       .ToHtmlString() 
      ) 
     ) 
     .DataKeys(keys => keys.Add(k => k.TypeListId)) 
     .Columns(columns => 
     { 
      columns.Bound(o => o.Name).Width(100); 
      columns.Bound(o => o.Description).Width(150); 
      columns.Command(commands => 
      { 
       commands.Edit().ButtonType(GridButtonType.Image); 
       commands.Delete().ButtonType(GridButtonType.Image); 
      } 
          ).Width(30); 
     }) 
     .DataBinding(dataBinding => 
     { 
      dataBinding.Ajax().Select("_TypeCodeList", "Host") 
           .Update("UpdateTypeList", "Host") 
           .Insert("InsertTypeList", "Host") 
           .Delete("DeleteTypeList", "Host") 
           .Enabled(true); 
      dataBinding.Server().Select("TypeCodeList", "Host", new { ajax = ViewData["ajax"] }); 
     } 
     ) 
     .Editable(editable => editable.Enabled(true).Mode(GridEditMode.InLine)) 
     .Pageable(page => page.PageSize(10)) 
     .Sortable() 
     .Selectable() 
     .Scrollable(scroll => scroll.Enabled(false)) 
     .NoRecordsTemplate("No Type Lists can be retrieved from the database") 
     .ToolBar(commands => commands.Insert()) 
     .Render(); 
} 

Enfin ... voici les classes ViewModel.

public class TypeCodeListViewModel 
{ 

    [ScaffoldColumn(false)] 
    public int TypeListId { get; set; } 

    [Required(ErrorMessage = "Required")] 
    [StringLength(25, ErrorMessage = "Max Length is 25")] 
    public string Name { get; set; } 

    [Required(ErrorMessage = "Required")] 
    [StringLength(25, ErrorMessage="Max Length is 25")] 
    public string Description { get; set; } 

    [ScaffoldColumn(false)] 
    public bool IsActive { get; set; } 


} 

public class TypeCodeViewModel 
{ 

    [ScaffoldColumn(false)] 
    public int TypeCodeId { get; set; } 

    [ScaffoldColumn(false)] 
    public int TypeListId { get; set; } 

    [Required(ErrorMessage = "Required")] 
    [StringLength(25, ErrorMessage = "Max Length is 25")] 
    [DisplayName("Name")] 
    public string CodeName { get; set; } 

    [Required(ErrorMessage = "Required")] 
    [StringLength(25, ErrorMessage = "Max Length is 25")] 
    [DisplayName("Value")] 
    public string CodeValue { get; set; } 

    [StringLength(500, ErrorMessage = "Max Length is 500")] 
    public string Description { get; set; } 

    [ScaffoldColumn(false)] 
    public bool IsActive { get; set; } 

} 
+0

Si vous souhaitez entrer en contact avec les experts telerik (je suppose que vous en aurez besoin) et obtenir un conseil, postez vos codes dans leurs forums. –

Répondre

0

Eh bien ... Je pense que j'ai tout compris moi-même ... il était aussi simple que de laisser la grille se lier lui-même et ne pas forcer les données dans via la méthode non-ajax qui est appelé à affichage initial de la page.

Le

Public ActionResult TypeCodeList() 
fonction

doit simplement être mis à jour à ce qui suit:

Public ActionResult TypeCodeList() 
{ 
    return View(); 
} 

sans [GridAction] décorateur.

Si vous ne forcez pas les valeurs dans la grille, elle se liera elle-même à l'aide de la méthode Ajax, puis les grilles enfant seront remplies lors de l'expansion.