【问题标题】:Unable to bind it to my Grid to a Telerik OpenAccess DataSource无法将它绑定到我的网格到 Telerik OpenAccess 数据源
【发布时间】:2014-09-29 16:27:01
【问题描述】:

我正在使用 ASP.MVC、Kendo 和 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 上定义了“set{}”后,此错误消息已得到解决,但我开始收到另一个错误消息

  • (...) 如果“CustomProperty”是一个属性,请将 FieldAlias 或 Storage 属性添加到它或将其声明为字段的别名。

【问题讨论】:

    标签: c# .net kendo-ui kendo-grid kendo-asp.net-mvc


    【解决方案1】:

    不要在视图中使用您的 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));
    }
    

    查看:

    模型没有传递到网格构造函数中,因为您使用的是 Read()。这也意味着您不需要在视图顶部定义模型。

    @{
        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)
         )
    )
    

    【讨论】:

    • 非常感谢@Nic 注意到我的错误并提供帮助。所有最好的伙伴;)
    • 我觉得@Nicholas 发布的答案忘记了 ToDataSourceResult() 将应用过滤和分页。因此,如果您在调用 ToDataSourceResult 之前调用 GetCustomers,您将使用默认查询命中数据,该查询将返回所有行(比如 10000 条记录)!!。
    • @MadaniBenghia 是的,没错,我只是展示了如何让它工作。我已经更新了我的答案。
    【解决方案2】:

    总的来说,@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();
    }
    

    关键是 customer 变量不会有自己的 CustomProperty。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多