2

ASP.MVC, Kendo 및 OpenAccess를 사용하여 응용 프로그램을 개발하고 있습니다.사용자 지정 부분 부분 클래스

특정 엔터티에 대한 사용자 지정 속성을 만든 후에 데이터 소스와 Grid에 바인딩하지 못했습니다.

부분 클래스

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ErpMvc.OpenAccess 
{ 
    public partial class Customer 
    { 
     public string CustomProperty 
     { 
      get 
      { 
       return "My Custom Property Text"; 
      } 
     } 
    } 
} 

서비스

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using ErpMvc.OpenAccess; 
using Kendo.Mvc.Extensions; 
using Kendo.Mvc.UI; 

namespace ErpMvc.Services 
{ 
    public class CustomerService 
    { 
     public static IEnumerable<Customer> GetCustomers() 
     { 
      var dbContext = new EntitiesModel(); 

      return dbContext.Customers.Select(customer => new Customer 
      { 
       CustomerID = customer.CustomerID, 
       FirstName = customer.FirstName, 
       CustomProperty = customer.CustomProperty 
      }); 

     } 
    } 
} 

보기

@model IEnumerable<ErpMvc.OpenAccess.Customer> 

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

@(Html.Kendo().Grid(Model) 
    .Name("Customers") 
    .Columns(columns => 
    { 
     columns.Bound(c => c.FirstName).Title("First Name"); 
     columns.Bound(c => c.CustomProperty).Title("Custom Property"); 
    }) 
    .Pageable() 
    .Sortable() 
    .Editable(editable => editable.Mode(GridEditMode.InLine)) 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .Model(model => model.Id(customerID => customerID.CustomerID)) 
     .Read(read => read.Action("Customers_Read", "Customer")) 
     .Update(update => update.Action("Customers_Update", "Customer")) 
     .PageSize(50) 
    ) 
) 

컨트롤러

public ActionResult Customers_Read([DataSourceRequest] DataSourceRequest request) 
{ 
    return Json(CustomerService.GetCustomers().ToDataSourceResult(request)); 
} 
  • 오류 메시지가 나는 할당 할 수 없습니다 VS

  • 건물 또는 인덱서 'CustomProperty'에서 받고 있어요 - 내 CustomProperty에 "{} 설정"정의 된 후에는

  • 읽기, 이 오류 메시지는 해결되었지만 다른 하나를 얻었습니다.

  • (...) 'CustomProperty'가 속성 인 경우 FieldAlias ​​또는 Storage 특성을 필드에 추가하거나 필드의 별칭으로 선언하십시오.

답변

0

보기에서 OpenAccess 개체를 사용하지 마십시오. 이 같은

시도 뭔가 (I 메모리로 바로 가고,이 테스트하지했습니다) :

뷰 모델 :

뷰에 필요한 모든 데이터를 포함하는 새 클래스를 정의합니다.

namespace ErpMvc.ViewModel 
{ 
    public class Customer 
    { 
     public int CustomerID { get; set; } 
     public string FirstName { get; set; } 
     public string CustomProperty { get; set; } 
    } 
} 

서비스 :

서비스가 OpenAccess를를 사용하여 데이터를 검색해야

는, 다음 뷰 모델에이 데이터를 전송합니다.

public static IQueryable<Customer> GetCustomers() 
{ 
    IQueryable<Customer> result = null; 
    using(var dbContext = new EntitiesModel()) 
    { 
     result = dbContext.Customers.Select(customer => new ViewModel.Customer 
     { 
      CustomerID = customer.CustomerID, 
      FirstName = customer.FirstName, 
      CustomProperty = customer.CustomProperty 
     }); 
     return result;   
    } 
} 

컨트롤러 :

public ActionResult Customers_Read([DataSourceRequest] DataSourceRequest request) 
{ 
    return Json(CustomerService.GetCustomers().ToDataSourceResult(request)); 
} 

보기 : 당신이 읽기를 사용하고 있기 때문에

모델은, 그리드 생성자에 전달되지 않습니다(). 이는 뷰의 맨 위에 모델을 정의 할 필요가 없음을 의미합니다.

@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

@(Html.Kendo().Grid<ErpMvc.ViewModel.Customer>() 
    .Name("Customers") 
    .Columns(columns => 
    { 
     columns.Bound(c => c.FirstName).Title("First Name"); 
     columns.Bound(c => c.CustomProperty).Title("Custom Property"); 
    }) 
    .Pageable() 
    .Sortable() 
    .Editable(editable => editable.Mode(GridEditMode.InLine)) 
    .DataSource(dataSource => dataSource 
     .Ajax() 
     .Model(model => model.Id(customerID => customerID.CustomerID)) 
     .Read(read => read.Action("Customers_Read", "Customer")) 
     .Update(update => update.Action("Customers_Update", "Customer")) 
     .PageSize(50) 
    ) 
) 
+0

내 실수를 발견하고 도움을 주신 것에 대해 매우 감사합니다. 가장 좋은 친구;) –

+0

@Nicholas에 의해 게시 된 응답을 ToDataSourceResult() 필터링 및 페이징 적용됩니다 잊고 있습니다 .ToDataSourceResult 호출하기 전에 GetCustomers 호출하면 모든 행을 반환합니다 기본 쿼리로 데이터를 칠 것입니다. (10000 레코드를 말하십시오)! –

+0

@MadaniBenghia 네, 그게 맞아요, 나는 단지 그것을 작동시키는 방법을 보여줬습니다. 내 대답을 업데이트했습니다. – Nicholas

0

일반적으로 @Nic에서 제안한 접근법은 올바른 방향입니다. OpenAccess의 관점에서 볼 때, 끝점에서 질의를 조금 더 수정할 필요가 있습니다. 그것은 다음과 유사하게 나타납니다

public static IEnumerable<ViewModel.Customer> GetCustomers() 
{ 
    var dbContext = new EntitiesModel(); 

    return dbContext.Customers.Select(customer => new ViewModel.Customer 
    { 
     CustomerID = customer.CustomerID, 
     FirstName = customer.FirstName, 
    }).ToList(); 
} 

점은 고객 변수가 자신의 CustomProperty이없는 것입니다.

이 정보가 도움이되기를 바랍니다.