如何在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"))
)
我想做的事情:
当我在LocationController中做调试停止时,我看不到IQueryable位置变量中的任何数据,只是查询-但如果我做
ToList()
,那么我可以在每个位置看到正确的地址。因此,我尝试向json结果添加值到视图,如:primaryaddress = location.addresses.GetElementAt(0).add1
只是想看看我能不能拿回些什么——这是行不通的。似乎即使我添加额外的地址和电话数据到Json结果视图绑定到位置模型,所以我不能得到我添加的那些额外的数据片段,这是有意义的。那么,我是否需要将视图关联到我将在其他地方构建的不同模型,并在网格中添加我想要的位置、地址和电话数据?
我已经尝试创建另一个位置部分类与PrimaryAddress和PrimaryPhone属性,并在该类内做foreach通过地址在位置类-但是当getter运行地址尚未填充,我得到空引用异常。
当使用标准razor语法和VS脚手架控制器时,我可以在视图中看到整个位置域对象,并通过每个位置的地址找到每个位置的主地址和电话。当我使用带有Ajax的Kendo Grid时,它将Json传递给视图,我迷失了如何将地址和电话数据获取到视图中。对不起,这可能是基本的,如果有人能给我指出一些关于使用剑道控件的最佳实践的文档,它可能会帮助我摆脱困境。我已经搜索并查看了teleerik网站,但我发现的Ajax/Json示例仅从数据库中的一个表中提取数据,该数据库已经与支架组件一起工作得很好。
我没有时间在这里给出一个完整的答案,但是一些事情的顶部…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());
}