使用来自控制器的 Json 数据重新绑定 Telerik TreeView
Rebind Telerik TreeView with Json data from controller
我正在为 MVC 使用 Telerik 扩展。
我有一个 TreeView 并想使用它:
- 打开网站时仅显示根元素,并在扩展时使用 Ajax 按需加载子元素 - 这有效!
- 搜索节点,然后重新绑定树宽度结果数据。
我无法让第 2 点起作用。部分代码:
查看:
@(Html.Telerik().TreeView()
.Name("OuTree")
.DataBinding(dataBinding =>
{
dataBinding.Ajax()
.Enabled(true)
.Select("NodePreview", "OrganizationalStructure");
})
)
控制器上第 1 点的扩展方法(成功!)
public JsonResult NodePreview(int? Value)
{
int nodeId = Value.HasValue == false ? 0 : Value.Value;
var request = OrganizationTreeNodeRequestCreate(nodeId);
var service = _ProductSetupService;
var response = service.OrganizationTreeNodeGet(request);
var tree = from ou in response.Children
select new
{
Value = ou.Id,
Text = ou.OrganizationUnit.Name,
LoadOnDemand = ou.Subordinates.Count > 0
};
return Json(tree, JsonRequestBehavior.AllowGet);
}
现在是困难的部分。
我希望能够搜索节点,然后将树与结果数据重新绑定。
我已经有一个 returns 层次结构的搜索服务。绑定有问题。
点 2 的控制器操作:
public JsonResult Search(SearchModel model)
{
var request = OrganizationTreeSearchRequestCreate(model);
var service = _ProductSetupService;
var response = service.OrganizationTreeSearch(request);
var treeViewItem = new TreeViewItem();
treeViewItem.BindTo(response.Results, mappings =>
{
mappings.For<OrganizationUnitTree>(binding => binding
.ItemDataBound((item, group) =>
{
item.Text = group.OrganizationUnit.Name;
item.Value = group.Id.ToString();
item.LoadOnDemand = true;
})
.Children(group => group.Subordinates));
});
return Json(treeViewItem, JsonRequestBehavior.AllowGet);
}
然后在客户端:
function ReloadTree(data) {
var treeview = $('#OuTree').data('tTreeView');
treeview.dataBind(data);
}
但是数据绑定不起作用。
感谢您的帮助。
成功了。
基本上我创建了一个模型:
public class OrganizationUnitTreeViewModel
{
public string Text { get; set; }
public string Value { get; set; }
public List<OrganizationUnitTreeViewModel> Items { get; set; }
public bool Expanded = true;
public bool LoadOnDemand = true;
}
那么在我的行动中:
public JsonResult Search(SearchModel model)
{
var request = OrganizationTreeSearchRequestCreate(model);
var service = _ProductSetupService;
var response = service.OrganizationTreeSearch(request);
List<OrganizationUnitTreeViewModel> treeModelList = ConvertOrganizationUnitTree(response.Results);
string json = JsonConvert.SerializeObject(treeModelList);
return Json(json, JsonRequestBehavior.AllowGet);
}
转换方法从分层 class 结构创建模型:
private List<OrganizationUnitTreeViewModel> ConvertOrganizationUnitTree(List<OrganizationUnitTree> tree)
{
List<OrganizationUnitTreeViewModel> treeModelList = new List<OrganizationUnitTreeViewModel>();
foreach (OrganizationUnitTree ou in tree)
{
OrganizationUnitTreeViewModel treeModel = new OrganizationUnitTreeViewModel();
treeModel.Text = ou.OrganizationUnit.Name;
treeModel.Value = ou.Id.ToString();
if (ou.Subordinates != null && ou.Subordinates.Count > 0)
{
List<OrganizationUnitTreeViewModel> items = new List<OrganizationUnitTreeViewModel>();
items.AddRange(ConvertOrganizationUnitTree(ou.Subordinates));
treeModel.Items = items;
}
treeModelList.Add(treeModel);
}
return treeModelList;
}
最后但并非最不重要的 JS:
function ReloadTree(data) {
var json = JSON.parse(data);
var treeview = $('#OuTree').data('tTreeView');
treeview.dataBind(json);}
就是这样。
希望对某人有用。
我正在为 MVC 使用 Telerik 扩展。
我有一个 TreeView 并想使用它:
- 打开网站时仅显示根元素,并在扩展时使用 Ajax 按需加载子元素 - 这有效!
- 搜索节点,然后重新绑定树宽度结果数据。
我无法让第 2 点起作用。部分代码:
查看:
@(Html.Telerik().TreeView()
.Name("OuTree")
.DataBinding(dataBinding =>
{
dataBinding.Ajax()
.Enabled(true)
.Select("NodePreview", "OrganizationalStructure");
})
)
控制器上第 1 点的扩展方法(成功!)
public JsonResult NodePreview(int? Value)
{
int nodeId = Value.HasValue == false ? 0 : Value.Value;
var request = OrganizationTreeNodeRequestCreate(nodeId);
var service = _ProductSetupService;
var response = service.OrganizationTreeNodeGet(request);
var tree = from ou in response.Children
select new
{
Value = ou.Id,
Text = ou.OrganizationUnit.Name,
LoadOnDemand = ou.Subordinates.Count > 0
};
return Json(tree, JsonRequestBehavior.AllowGet);
}
现在是困难的部分。 我希望能够搜索节点,然后将树与结果数据重新绑定。 我已经有一个 returns 层次结构的搜索服务。绑定有问题。
点 2 的控制器操作:
public JsonResult Search(SearchModel model)
{
var request = OrganizationTreeSearchRequestCreate(model);
var service = _ProductSetupService;
var response = service.OrganizationTreeSearch(request);
var treeViewItem = new TreeViewItem();
treeViewItem.BindTo(response.Results, mappings =>
{
mappings.For<OrganizationUnitTree>(binding => binding
.ItemDataBound((item, group) =>
{
item.Text = group.OrganizationUnit.Name;
item.Value = group.Id.ToString();
item.LoadOnDemand = true;
})
.Children(group => group.Subordinates));
});
return Json(treeViewItem, JsonRequestBehavior.AllowGet);
}
然后在客户端:
function ReloadTree(data) {
var treeview = $('#OuTree').data('tTreeView');
treeview.dataBind(data);
}
但是数据绑定不起作用。
感谢您的帮助。
成功了。
基本上我创建了一个模型:
public class OrganizationUnitTreeViewModel
{
public string Text { get; set; }
public string Value { get; set; }
public List<OrganizationUnitTreeViewModel> Items { get; set; }
public bool Expanded = true;
public bool LoadOnDemand = true;
}
那么在我的行动中:
public JsonResult Search(SearchModel model)
{
var request = OrganizationTreeSearchRequestCreate(model);
var service = _ProductSetupService;
var response = service.OrganizationTreeSearch(request);
List<OrganizationUnitTreeViewModel> treeModelList = ConvertOrganizationUnitTree(response.Results);
string json = JsonConvert.SerializeObject(treeModelList);
return Json(json, JsonRequestBehavior.AllowGet);
}
转换方法从分层 class 结构创建模型:
private List<OrganizationUnitTreeViewModel> ConvertOrganizationUnitTree(List<OrganizationUnitTree> tree)
{
List<OrganizationUnitTreeViewModel> treeModelList = new List<OrganizationUnitTreeViewModel>();
foreach (OrganizationUnitTree ou in tree)
{
OrganizationUnitTreeViewModel treeModel = new OrganizationUnitTreeViewModel();
treeModel.Text = ou.OrganizationUnit.Name;
treeModel.Value = ou.Id.ToString();
if (ou.Subordinates != null && ou.Subordinates.Count > 0)
{
List<OrganizationUnitTreeViewModel> items = new List<OrganizationUnitTreeViewModel>();
items.AddRange(ConvertOrganizationUnitTree(ou.Subordinates));
treeModel.Items = items;
}
treeModelList.Add(treeModel);
}
return treeModelList;
}
最后但并非最不重要的 JS:
function ReloadTree(data) {
var json = JSON.parse(data);
var treeview = $('#OuTree').data('tTreeView');
treeview.dataBind(json);}
就是这样。 希望对某人有用。