This question is locked. New answers and comments are not allowed.
Hello,
I have the following test code on my view:
When the page is rendered on the client, the second grid's ID is rendered as such:
Whilst it should render something along the lines of
Notice how I use the same client-side expression on the Select databinding handler and it does work there.
I.e, when I click open the first record, it will perform an ajax callback to my controller and the url does contain "?legalEntityId=98451" and not "?legalEntityId=___LegalEntityId___"
So bottom line is:
This works, it correctly replaces "<#= LegalEntityId #>" with the actual ID value of the parent:
This does NOT work, it replaces "<#= LegalEntityId #>" with "___LegalEntityId__":
Any ideas?
I have the following test code on my view:
@(Html.Telerik() .Grid<RequestLegalEntityModel>() .Name("gridScheduleOfValues") .TableHtmlAttributes(new { style = "table-layout: fixed" }) .Columns(c => { c.Bound(m => m.Name).Title("Legal Entity"); }) .DataBinding(db => db.Ajax() .Select("SelectEntities", "GridTest") ) .DetailView(details => details.ClientTemplate( Html.Telerik().Grid<PropertySovMaterialDamageLocationModel>() .Name("gridLegalEntity_<#= LegalEntityId #>") .DataBinding(db => db.Ajax() .Select("SelectMDLocations", "GridTest", new { legalEntityId = "<#= LegalEntityId #>" }) ) .Columns(c => { c.Bound(m => m.RequestLocationName); }) .ToHtmlString() ) ))When the page is rendered on the client, the second grid's ID is rendered as such:
<div id="gridLegalEntity_____LegalEntityId___" class="t-widget t-grid">Whilst it should render something along the lines of
<div id="gridLegalEntity_98451" class="t-widget t-grid">Notice how I use the same client-side expression on the Select databinding handler and it does work there.
I.e, when I click open the first record, it will perform an ajax callback to my controller and the url does contain "?legalEntityId=98451" and not "?legalEntityId=___LegalEntityId___"
.DataBinding(db => db.Ajax() .Select("SelectMDLocations", "GridTest", new { legalEntityId = "<#= LegalEntityId #>" } ))So bottom line is:
This works, it correctly replaces "<#= LegalEntityId #>" with the actual ID value of the parent:
.DataBinding(db => db.Ajax() .Select("SelectMDLocations", "GridTest", new { legalEntityId = "<#= LegalEntityId #>" } ))This does NOT work, it replaces "<#= LegalEntityId #>" with "___LegalEntityId__":
.Name("gridLegalEntity_<#= LegalEntityId #>")Any ideas?
5 Answers, 1 is accepted
0
Pechka
Top achievements
Rank 1
answered on 01 Jun 2012, 03:44 PM
Hi
I think client expressions are surrounded with #= # instead of <#= #> which is used in MVC Extensions.
I think client expressions are surrounded with #= # instead of <#= #> which is used in MVC Extensions.
0
Licenses
Top achievements
Rank 1
answered on 01 Jun 2012, 04:02 PM
Nope, I've been following the online documentation:
http://www.telerik.com/help/aspnet-mvc/telerik-ui-components-grid-master---detail-client-detail-template-and-hierarchy.html#ClientHierarchy
http://www.telerik.com/help/aspnet-mvc/telerik-ui-components-grid-master---detail-client-detail-template-and-hierarchy.html#ClientHierarchy
0
Licenses
Top achievements
Rank 1
answered on 05 Jun 2012, 09:07 AM
Bump, does anyone see the problem with my setup?
0
Licenses
Top achievements
Rank 1
answered on 05 Jun 2012, 12:52 PM
Hello,
I've tracked it down to being a bug in the version of the internal build we're using. (2012.1.522.340)
I have copied over all my code and started a new telerik MVC3 project using the opensource license (2012.1.214.340) and the grids work fine (they all get their seperate unique ID's)
I've tracked it down to being a bug in the version of the internal build we're using. (2012.1.522.340)
I have copied over all my code and started a new telerik MVC3 project using the opensource license (2012.1.214.340) and the grids work fine (they all get their seperate unique ID's)
0
Licenses
Top achievements
Rank 1
answered on 05 Jun 2012, 01:04 PM
This is the code I have used for testing. It can be copied and pasted directly into an existing test project, no database interaction required.
View:
Controller:
Model:
Might need to change the namespaces and using statements in certain places.
View:
@model GridTestModel@using Telerik.Web.Mvc.UI;@using ClientSideValidationBug001.Models;@using System.Web.Script.Serialization;@using System.Text;@{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Layout.cshtml";}<script type="text/javascript"> function LegalEntities_DataBound(e) { var grid = $(this).data('tGrid'); expandFirstRow(grid, e.row); } function expandFirstRow(grid, row) { if (grid.$rows().index(row) == 0) { grid.expandRow(row); } }</script>@(Html.Telerik().Grid<TestLegalEntity>() .Name("gridLegalEntities") .TableHtmlAttributes(new { style = "table-layout: fixed" }) .Columns(c => { c.Command(com => { com.Edit().ButtonType(GridButtonType.Image); com.Delete().ButtonType(GridButtonType.Image); }).Width(75); c.Bound(m => m.Name).Title("Legal Entity"); }) .DataKeys(dk => dk.Add(m => m.Id)) .DataBinding(db => db.Ajax().OperationMode(GridOperationMode.Server) .Select("SelectLegalEntities", "GridTest", new { requestId = Model.RequestId }) .Update("UpdateLegalEntity", "GridTest") .Insert("InsertLegalEntity", "GridTest", new { requestId = Model.RequestId }) .Delete("DeleteLegalEntity", "GridTest") ) .ClientEvents(e => e.OnRowDataBound("LegalEntities_DataBound")) .DetailView(d => d.ClientTemplate( Html.Telerik().Grid<TestLocation>() .Name("gridLocations_<#= Id #>") .Columns(c => { c.Command(com => { com.Edit().ButtonType(GridButtonType.Image); com.Delete().ButtonType(GridButtonType.Image); }); c.Bound(m => m.Name); c.Bound(m => m.Address); c.Bound(m => m.Postcode); c.Bound(m => m.City); c.Bound(m => m.State); c.Bound(m => m.Country); }) .DataKeys(dk => dk.Add(m => m.Id)) .DataBinding(db => db.Ajax().OperationMode(GridOperationMode.Server) .Select("SelectLocations", "GridTest", new { legalEntityId = "<#= Id #>" }) .Insert("InsertLocation", "GridTest", new { legalEntityId = "<#= Id #>" }) .Update("UpdateLocation", "GridTest", new { legalEntityId = "<#= Id #>" }) .Delete("DeleteLocation", "GridTest", new { legalEntityId = "<#= Id #>" }) ) .ToHtmlString() ) ))Controller:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using Telerik.Web.Mvc;using ClientSideValidationBug001.Models;namespace ClientSideValidationBug001.Controllers{ public class GridTestController : Controller { private static GridTestModel _myModel; public GridTestModel MyModel { get { if (_myModel == null) { _CreateModel(); } return _myModel; } set { _myModel = value; } } public ActionResult Index() { return View(MyModel); } private void _CreateModel() { _myModel = new GridTestModel() { RequestId = 1234, LegalEntities = new List<TestLegalEntity>() { new TestLegalEntity() { Id = 1, RequestId = 1234, Name = "Legal Entity 1", Locations = new List<TestLocation>() { new TestLocation() { Id = 1, TestLegalEntityId = 1, Name = "Test location 1", Address = "Test address 1", Postcode = "134679", City = "Test city 1", State = "Test state 1", Country = "Test country 1", MaterialDamageDetails = new TestLocationMaterialDamageDetails() { Id = 1, TestLocationId = 1, BuildingValuationTypeId = 1, ContentsValuationTypeId = 2, StockValuationTypeId = 3, Other1ValuationTypeId = 4, Other1LabelText = "My custom label" }, MaterialDamageData = new TestLocationMaterialDamageData() { Id = 1, TestLocationId = 1, BuildingInsured = 100, ContentsInsured = 100, StockInsured = 100, StockPercentage = 100, Other1Insured = 100, TotalRate = 2, TotalPremium = 100, UseTotalRate = true }, BusinessInterruptionDetails = new TestLocationBusinessInterruptionDetails() { Id = 1, TestLocationId = 1, Other1LabelText = "My custom label" }, BusinessInterruptionData = new TestLocationBusinessInterruptionData() { Id = 1, TestLocationId = 1, GrossProfitInsured = 100, WagesInsured = 100, ICOWInsured = 100, Other1Insured = 100, TotalRate = 2, UseTotalRate = true, TotalPremium = 100 } }, new TestLocation() { Id = 2, TestLegalEntityId = 1, Name = "Test location 1.2", Address = "Test address 1.2", Postcode = "134679", City = "Test city 1.2", State = "Test state 1.2", Country = "Test country 1.2", MaterialDamageDetails = new TestLocationMaterialDamageDetails() { Id = 2, TestLocationId = 2, BuildingValuationTypeId = 1, ContentsValuationTypeId = 2, StockValuationTypeId = 3, Other1ValuationTypeId = 4, Other1LabelText = "My custom label" }, MaterialDamageData = new TestLocationMaterialDamageData() { Id = 2, TestLocationId = 2, BuildingInsured = 100, ContentsInsured = 100, StockInsured = 100, StockPercentage = 100, Other1Insured = 100, TotalRate = 2, TotalPremium = 100, UseTotalRate = true }, BusinessInterruptionDetails = new TestLocationBusinessInterruptionDetails() { Id = 2, TestLocationId = 2, Other1LabelText = "My custom label" }, BusinessInterruptionData = new TestLocationBusinessInterruptionData() { Id = 2, TestLocationId = 2, GrossProfitInsured = 100, WagesInsured = 100, ICOWInsured = 100, Other1Insured = 100, TotalRate = 2, UseTotalRate = true, TotalPremium = 100 } } } }, new TestLegalEntity() { Id = 2, RequestId = 1234, Name = "Legal Entity 2", Locations = new List<TestLocation>() { new TestLocation() { Id = 3, TestLegalEntityId = 2, Name = "Test location 2", Address = "Test address 2", Postcode = "134679", City = "Test city 2", State = "Test state 2", Country = "Test country 2", MaterialDamageDetails = new TestLocationMaterialDamageDetails() { Id = 3, TestLocationId = 3, BuildingValuationTypeId = 1, ContentsValuationTypeId = 2, StockValuationTypeId = 3, Other1ValuationTypeId = 4, Other1LabelText = "My custom label" }, MaterialDamageData = new TestLocationMaterialDamageData() { Id = 3, TestLocationId = 3, BuildingInsured = 100, ContentsInsured = 100, StockInsured = 100, StockPercentage = 100, Other1Insured = 100, TotalRate = 2, TotalPremium = 100, UseTotalRate = true }, BusinessInterruptionDetails = new TestLocationBusinessInterruptionDetails() { Id = 3, TestLocationId = 3, Other1LabelText = "My custom label" }, BusinessInterruptionData = new TestLocationBusinessInterruptionData() { Id = 3, TestLocationId = 3, GrossProfitInsured = 100, WagesInsured = 100, ICOWInsured = 100, Other1Insured = 100, TotalRate = 2, UseTotalRate = true, TotalPremium = 100 } } } }, new TestLegalEntity() { Id = 3, RequestId = 1234, Name = "Legal Entity 3", Locations = new List<TestLocation>() { new TestLocation() { Id = 4, TestLegalEntityId = 3, Name = "Test location 3", Address = "Test address 3", Postcode = "134679", City = "Test city 3", State = "Test state 3", Country = "Test country 3", MaterialDamageDetails = new TestLocationMaterialDamageDetails() { Id = 4, TestLocationId = 4, BuildingValuationTypeId = 1, ContentsValuationTypeId = 2, StockValuationTypeId = 3, Other1ValuationTypeId = 4, Other1LabelText = "My custom label" }, MaterialDamageData = new TestLocationMaterialDamageData() { Id = 4, TestLocationId = 4, BuildingInsured = 100, ContentsInsured = 100, StockInsured = 100, StockPercentage = 100, Other1Insured = 100, TotalRate = 2, TotalPremium = 100, UseTotalRate = true }, BusinessInterruptionDetails = new TestLocationBusinessInterruptionDetails() { Id = 4, TestLocationId = 4, Other1LabelText = "My custom label" }, BusinessInterruptionData = new TestLocationBusinessInterruptionData() { Id = 4, TestLocationId = 4, GrossProfitInsured = 100, WagesInsured = 100, ICOWInsured = 100, Other1Insured = 100, TotalRate = 2, UseTotalRate = true, TotalPremium = 100 } } } } } }; } #region Telerik Grid callbacks #region Legal entities grid callbacks [HttpPost] [GridAction] public ActionResult SelectLegalEntities(int requestId) { var entities = MyModel.LegalEntities.Where(x => x.RequestId == requestId); return View(new GridModel(entities)); } [HttpPost] [GridAction] public ActionResult InsertLegalEntity(int requestId) { var entity = new TestLegalEntity(); entity.RequestId = requestId; if (TryUpdateModel<TestLegalEntity>(entity)) { var lastId = MyModel.LegalEntities.OrderByDescending(x => x.Id).Last().Id; entity.Id = (lastId + 1); MyModel.LegalEntities.ToList().Add(entity); } return SelectLegalEntities(requestId); } [HttpPost] [GridAction] public ActionResult UpdateLegalEntity(int id) { var current = MyModel.LegalEntities.SingleOrDefault(x => x.Id == id); TryUpdateModel<TestLegalEntity>(current); return SelectLegalEntities(current.RequestId); } [HttpPost] [GridAction] public ActionResult DeleteLegalEntity(int id) { var entity = MyModel.LegalEntities.SingleOrDefault(x => x.Id == id); if (entity != null) { MyModel.LegalEntities.ToList().Remove(entity); } return SelectLegalEntities(entity.RequestId); } #endregion #region Locations grid callbacks [HttpPost] [GridAction] public ActionResult SelectLocations(int legalEntityId) { var entity = MyModel.LegalEntities.SingleOrDefault(x => x.Id == legalEntityId); if (entity != null) { return Json(entity.Locations); } else { throw new Exception(string.Format("Legal entity with ID {0} not found!", legalEntityId)); } } [HttpPost] [GridAction] public ActionResult InsertLocation(int legalEntityId) { var entity = MyModel.LegalEntities.SingleOrDefault(x => x.Id == legalEntityId); if (entity != null) { var location = new TestLocation(); location.TestLegalEntityId = legalEntityId; if (TryUpdateModel<TestLocation>(location)) { var lastId = entity.Locations.OrderByDescending(x => x.Id).Last().Id; location.Id = (lastId + 1); entity.Locations.ToList().Add(location); } return Json(entity.Locations); } else { throw new Exception(string.Format("Legal entity with ID {0} not found!", legalEntityId)); } } [HttpPost] [GridAction] public ActionResult UpdateLocation(int id, int legalEntityId) { var entity = MyModel.LegalEntities.SingleOrDefault(x => x.Id == legalEntityId); if (entity != null) { var location = entity.Locations.SingleOrDefault(x => x.Id == id); if (location == null) { throw new Exception(string.Format("Location with ID {0} for Legal entity with ID {1} not found!", id, legalEntityId)); } TryUpdateModel<TestLocation>(location); return Json(entity.Locations); } else { throw new Exception(string.Format("Legal entity with ID {0} not found!", legalEntityId)); } } [HttpPost] [GridAction] public ActionResult DeleteLocation(int id, int legalEntityId) { var entity = MyModel.LegalEntities.SingleOrDefault(x => x.Id == legalEntityId); if (entity != null) { var location = entity.Locations.SingleOrDefault(x => x.Id == id); if (location == null) { throw new Exception(string.Format("Location with ID {0} for Legal entity with ID {1} not found!", id, legalEntityId)); } entity.Locations.ToList().Remove(location); return Json(entity.Locations); } else { throw new Exception(string.Format("Legal entity with ID {0} not found!", legalEntityId)); } } #endregion #endregion }}Model:
using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace ClientSideValidationBug001.Models{ public class GridTestModel { public int RequestId { get; set; } public IEnumerable<TestLegalEntity> LegalEntities; } public class TestLegalEntity { public int Id { get; set; } public int RequestId { get; set; } public string Name { get; set; } public IEnumerable<TestLocation> Locations { get; set; } } public class TestLocation { public int Id { get; set; } public int TestLegalEntityId { get; set; } public string Name { get; set; } public string Address { get; set; } public string Postcode { get; set; } public string City { get; set; } public string State { get; set; } public string Country { get; set; } public TestLocationMaterialDamageData MaterialDamageData { get; set; } public TestLocationMaterialDamageDetails MaterialDamageDetails { get; set; } public TestLocationBusinessInterruptionData BusinessInterruptionData { get; set; } public TestLocationBusinessInterruptionDetails BusinessInterruptionDetails { get; set; } } public class TestLocationMaterialDamageData { public int Id { get; set; } public int TestLocationId { get; set; } public decimal? BuildingInsured { get; set; } public decimal? ContentsInsured { get; set; } public decimal? StockInsured { get; set; } public decimal? StockPercentage { get; set; } public decimal? Other1Insured { get; set; } public decimal? TotalRate { get; set; } public bool UseTotalRate { get; set; } public decimal? TotalPremium { get; set; } } public class TestLocationMaterialDamageDetails { public int Id { get; set; } public int TestLocationId { get; set; } public int BuildingValuationTypeId { get; set; } public int ContentsValuationTypeId { get; set; } public int StockValuationTypeId { get; set; } public int Other1ValuationTypeId { get; set; } public string Other1LabelText { get; set; } } public class TestLocationBusinessInterruptionData { public int Id { get; set; } public int TestLocationId { get; set; } public decimal? GrossProfitInsured { get; set; } public decimal? WagesInsured { get; set; } public decimal? ICOWInsured { get; set; } public decimal? Other1Insured { get; set; } public decimal? TotalRate { get; set; } public bool UseTotalRate { get; set; } public decimal? TotalPremium { get; set; } } public class TestLocationBusinessInterruptionDetails { public int Id { get; set; } public int TestLocationId { get; set; } public string Other1LabelText { get; set; } }}Might need to change the namespaces and using statements in certain places.