如何在MVC5中访问剑道UI网格中的实体框架域对象?

本文关键字:框架 实体 对象 网格 MVC5 访问 UI | 更新日期: 2023-09-27 17:53:46

我是web开发,c#和。net (VS2013)的新手,不确定我是否正确地问这个问题,但在通过书籍,所有通过telerik文档和谷歌搜索之后,我仍然停留在一些简单的东西上。

我想做的是在MVC应用程序中创建一个页面,使用剑道网格和Ajax来显示客户端位置的信息,并包括主要电话。号码和主地址。

My Domain Objects

public partial class location
{
    public location()
    {
        this.addresses = new HashSet<address>();
        this.location_note = new HashSet<location_note>();
        this.phones = new HashSet<phone>();
    }
    public long id { get; set; }
    public long acct_id { get; set; }
    public Nullable<bool> active { get; set; }
    public string name { get; set; }
    public string contact { get; set; }
    public Nullable<long> location_account_id { get; set; }
    public virtual ICollection<address> addresses { get; set; }
    public virtual ICollection<location_note> location_note { get; set; }
    public virtual ICollection<phone> phones { get; set; }
}

public partial class address
{
    public long id { get; set; }
    public long acct_id { get; set; }
    public long location_id { get; set; }
    public bool primary { get; set; }
    public string add1 { get; set; }
    public string add2 { get; set; }
    public string city { get; set; }
    public string county { get; set; }
    public string state { get; set; }
    public string zip { get; set; }
    public string comment { get; set; }
    public long address_type_id { get; set; }
    public virtual address_type address_type { get; set; }
    public virtual location location { get; set; }
}

public partial class phone
{
    public long id { get; set; }
    public long acct_id { get; set; }
    public long location_id { get; set; }
    public bool primary { get; set; }
    public long phone_type_id { get; set; }
    public string number { get; set; }
    public virtual location location { get; set; }
    public virtual phone_type phone_type { get; set; }

My scaffded LocationController

public class LocationController : Controller
{
    private vessenceEntities db = new vessenceEntities();
    public ActionResult Index()
    {
        return View();
    }
    public ActionResult locations_Read([DataSourceRequest]DataSourceRequest request)
    {
        IQueryable<location> locations = db.locations;
        DataSourceResult result = locations.ToDataSourceResult(request, location => new {
            id = location.id,
            acct_id = location.acct_id,
            active = location.active,
            name = location.name,
            contact = location.contact,
            location_account_id = location.location_account_id,
        });
        return Json(result);
    }

My View - Index.cshtml

@(Html.Kendo().Grid<VEPrototype.location>()
  .Name("grid")
  .Columns(columns =>
  {
    columns.Bound(c => c.acct_id);
    columns.Bound(c => c.active);
    columns.Bound(c => c.name);
    columns.Bound(c => c.contact);
    columns.Bound(c => c.location_account_id);
    })
  })
  .ToolBar(toolbar => {
        toolbar.Create();
        toolbar.Excel();
        toolbar.Pdf();
  }) 
  .Editable(editable => editable.Mode(GridEditMode.PopUp))
  .Pageable()
  .Sortable(sortable => {
      sortable.SortMode(GridSortMode.MultipleColumn);
  })
  .Filterable()
  .Scrollable()
  .DataSource(dataSource => dataSource
      .Ajax()
      .Model(model => model.Id(p => p.id))
      .Read(read => read.Action("locations_Read", "Location"))
  )

我想做的事情:

  1. 当我在LocationController中做调试停止时,我看不到IQueryable位置变量中的任何数据,只是查询-但如果我做ToList(),那么我可以在每个位置看到正确的地址。因此,我尝试向json结果添加值到视图,如:

    primaryaddress = location.addresses.GetElementAt(0).add1
    

    只是想看看我能不能拿回些什么——这是行不通的。似乎即使我添加额外的地址和电话数据到Json结果视图绑定到位置模型,所以我不能得到我添加的那些额外的数据片段,这是有意义的。那么,我是否需要将视图关联到我将在其他地方构建的不同模型,并在网格中添加我想要的位置、地址和电话数据?

  2. 我已经尝试创建另一个位置部分类与PrimaryAddress和PrimaryPhone属性,并在该类内做foreach通过地址在位置类-但是当getter运行地址尚未填充,我得到空引用异常。

当使用标准razor语法和VS脚手架控制器时,我可以在视图中看到整个位置域对象,并通过每个位置的地址找到每个位置的主地址和电话。当我使用带有Ajax的Kendo Grid时,它将Json传递给视图,我迷失了如何将地址和电话数据获取到视图中。对不起,这可能是基本的,如果有人能给我指出一些关于使用剑道控件的最佳实践的文档,它可能会帮助我摆脱困境。我已经搜索并查看了teleerik网站,但我发现的Ajax/Json示例仅从数据库中的一个表中提取数据,该数据库已经与支架组件一起工作得很好。

如何在MVC5中访问剑道UI网格中的实体框架域对象?

我没有时间在这里给出一个完整的答案,但是一些事情的顶部…IQueryable是一个延迟执行接口,这意味着在对查询调用. tolist()之类的东西之前,查询实际上不会运行。其次,我建议考虑使用AutoMapper,这样你就可以将数据传输对象(客户端模型)与那些持久化到数据库的对象(实体模型)分开(如果映射很简单,你也可以在没有AutoMapper的情况下进行这种映射)。考虑到这两件事将允许您在一个上下文中测试DTO和客户端绑定,并在另一个上下文中测试控制器到实体绑定,从而消除一些魔力。

编辑# 1:

下面是一个使用OData的实体到DTO映射的例子:

    [EnableQuery]
    public IQueryable<FooDto> Get()
    {
        // Load set into read-only context for performance.
        var sets = Context.Foos.AsNoTracking();
        // AutoMapper will modify the database query to support exposing DTOs
        var setsDtos = sets.Project().To<FooDto>();
        return setsDtos;
    }

或者这里是使用OData的单个结果的情况:

    [EnableQuery]
    public SingleResult<FooDto> Get(string key)
    {
        return
            SingleResult.Create(
                Context.Foos.AsNoTracking().Where(set => set.FooId == key)
                    .Project()
                    .To<FooDto>()
                    .AsQueryable());
    }