2

我開發一個應用程序使用ASP.MVC,劍道和OpenAccess。自定義屬性部分類

爲特定實體創建自定義屬性後,我試圖將其綁定到我的數據源和網格失敗。

偏類

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對象。

嘗試這樣的事情(我沒有通過測試的內存這,只是去):

視圖模型:

定義包含了視圖需要的所有數據的新類。

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

非常感謝@Nic注意到我的錯誤和您的幫助。所有最好的朋友;) – 2014-09-30 15:44:51

+0

我覺得@Nicholas發佈的答案忘記了ToDataSourceResult()將應用過濾和分頁。因此,如果您在調用ToDataSourceResult之前調用GetCustomers,那麼將使用默認查詢命中數據,這將返回所有行(比如說10000條記錄)!! – 2016-12-13 08:08:11

+0

@MadaniBenghia是的,這是正確的,我只展示瞭如何讓它工作。我已經更新了我的答案。 – Nicholas 2016-12-13 10:11:31

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的。

我希望這會有所幫助。