2011-05-15 64 views
0

好的......我花了太多時間在這個上面掙扎,所以我將它傳遞給了專家 - >你。ASP.NET MVC Rails的Telerik Rad Grid Razor視圖引擎 - DetailView最初沒有填充

我非常簡單的ASP.NET MVC(v3 with Razor View Engine)頁面使用Telerik Rad Grid控件來顯示一些類型列表,然後我在網格的DetailsView中顯示相關的代碼。

做人口很容易。我有我的TypeCodeList類型的ViewModel並將其發送到強類型的視圖來填充網格。這工作良好...和網格看起來很棒 - 感謝Telerik。但是,我添加了DetailsView,然後以相同的方式填充子類型代碼。壞消息是,當我的網格填充時,我選擇左側的三角形展開樹並查看子記錄,沒有任何內容。但是,如果我選擇網格底部的「刷新」按鈕,那麼我可以打三角形和子記錄顯示。

因此(總之),子記錄不顯示在初始加載。只有當我選擇網格的AJAX刷新時,我纔會得到這些孩子。否則,它按要求工作。

我一直在試圖看看我是否可以編程的方式在頁面加載時通過javascrip啓動刷新。或者如果我可以在沒有首先進行刷新的情況下選擇自己填充的東西 - 那會更好。

下面是我的代碼:

相關的控制器代碼(我已經採取了更新,刪除,插入記錄和數據訪問方法)

[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 

} 

這是我查看代碼: (我已經採取了所有我失敗的JavaScript的嘗試,試圖迫使在頁面加載負荷)

@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(); 
} 

最後......這裏的視圖模型類:

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

如果您想與telerik專家取得聯繫(我想您會需要他們)並獲得建議,請在您的論壇中發佈您的代碼。 – 2011-05-19 15:36:44

回答

0

嗯......我想我想通了我自己......這是簡單的只是讓電網綁定本身,並通過非Ajax方法獲取呼籲不是逼着數據進去初始顯示頁面。

Public ActionResult TypeCodeList() 

函數應該簡單地被更新,以執行以下操作:

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

無[GridAction]裝飾器。

如果您不強制值到網格中,它將使用Ajax方法綁定自身,然後子網格將在擴展時填充。