Asp.net mvc Asp MVC Telerik网格和实体框架中枚举的处理
对于开发中的web应用程序(ASP.NETMVC),我使用的是telerik网格。网格绑定到我的列表的IQueryable,因为它是一个大表,我希望telerik在列表上应用它的过滤器,然后执行这个结果,而不是加载10000行(使用联接表),然后使用过滤器,只使用行 我正在使用网格的过滤器/顺序(我真的需要这个页面,这是关键特性之一) 其中一个主列(确定数据的类型)是枚举 问题是,在尝试对指定类型成员进行筛选/排序时,我会得到一个Asp.net mvc Asp MVC Telerik网格和实体框架中枚举的处理,asp.net-mvc,entity-framework,enums,telerik,telerik-grid,Asp.net Mvc,Entity Framework,Enums,Telerik,Telerik Grid,对于开发中的web应用程序(ASP.NETMVC),我使用的是telerik网格。网格绑定到我的列表的IQueryable,因为它是一个大表,我希望telerik在列表上应用它的过滤器,然后执行这个结果,而不是加载10000行(使用联接表),然后使用过滤器,只使用行 我正在使用网格的过滤器/顺序(我真的需要这个页面,这是关键特性之一) 其中一个主列(确定数据的类型)是枚举 问题是,在尝试对指定类型成员进行筛选/排序时,我会得到一个“指定类型成员在linq to entities中不受支持” 我必
“指定类型成员在linq to entities中不受支持”
我必须将它绑定到enum(而不是映射的int)上,因为如果我使用id,filters/orderby将位于int上,并且我不能期望用户知道外部表的id
我只是不能再次实现我自己的所有网格参数(位于url中)(我假设,要么我什么都做,要么什么都不做)并正确地过滤它,正确地排序它)
你有解决问题的办法吗?你真的没有选择余地(或者只有几个恼人的选择) 是否使用类而不是枚举(但如果使用枚举,那是因为它更好) 或者对枚举进行“伪排序”,并使用映射的int
public enum TT
{
Brown = 0,
Green = 1
}
当然,您必须检查数据库中的实际数据(映射int),并更新它们以符合新的顺序(不能更改枚举顺序而不产生影响)。每次要在现有枚举值之间插入值时,都必须这样做
或者您等待下一个EF/linq/c#版本,它应该在linq2entities中具有enum支持我不知道您的实体模型看起来如何,但我假设您有类似于此模型的东西:
public partial class Project
{
public int Id { get; set; }
public string Name { get; set; }
public int Status { get; set; }
}
Status属性表示您的枚举值,然后您可以使用此枚举:
public enum ProjectStatuses
{
Current = 1,
Started = 2,
Stopped = 3,
Finished = 4,
}
然后创建新的ViewModel,如下所示:
public class ProjectDetails
{
public int Id { get; set; }
public string Name { get; set; }
public int Status { get; set; }
public ProjectStatuses StatusValue { get { return (ProjectStatuses) Status; } }
// This property to display in telerik ClientTemplate
public string StatusName { get { return Enum.GetName(typeof (ProjectStatuses), Status ); } }
}
由于我喜欢扩展方法,我将添加以下方法:
public static class ModelListExtensions
{
public static IQueryable<ProjectDetails> ToViewModelDetails(this IQueryable<Project> modelList)
{
return modelList.Select(m => new ProjectDetails
{
Id = m.Id,
Name = m.Name,
Status = m.Status,
};
}
}
我就是不能,这个网站是本地化的,所以有时候棕色的会排在第一位,有时候绿色的会排在第一位。我不能把一个类放在这里,数据库设计在几个月前就被API/backup/锁定了。。。需要。(正如您所说,这确实是DB的最佳选择。我知道会发生这种情况,但这应该是一个解决办法。在将网格绑定到我的模型的属性时,是否可以这样做?@J4N如果您不想添加ViewModel类,那么您可以将您的模型扩展到一个分部类中,然后将另外两个属性放入其中“
StatusValue
和StatusName
"在我们的示例中。为了确定,您能告诉我您是如何在视图中将数据绑定到网格的吗?您的解决方案看起来非常棒,我将在接下来的几天内尝试它!如果它有效,我肯定会给您一杯啤酒!我对GridCommand一无所知。如果我有服务器绑定,我想我可以将其作为我的活动的参数如果你想用我的方式在“Where,Sort,Page and GroupBy”方法中使用我的方式,那么你应该使用Telerik.Web.Mvc.Extensions向你的控制器添加
public ActionResult Index()
{
int total;
var viewModel = getGridList(out total);
ViewBag.Total = total;
return View(viewModel);
}
//this Action to get ajax pages
[GridAction(EnableCustomBinding = true)]
public ActionResult ReGetIndex(GridCommand command, int roleId)
{
int total;
var list = getGridList(out total, roleId, command);
return View(new GridModel {Data = list, Total = total});
}
private IEnumerable<ProjectDetails> getGridList(out int total, GridCommand command = null)
{
command = command ?? new GridCommand {Page = 1};
foreach (var descriptor in command.SortDescriptors)
{
if (descriptor.Member == "StatusValue")
descriptor.Member = "Status";
}
foreach (FilterDescriptor descriptor in command.FilterDescriptors)
{
if (descriptor.Member == "StatusValue")
descriptor.Member = "Status";
}
var list = modelService.AllAsQuery()
.ToViewModelDetails() // To convert it to our ViewModel if we have one
.Where(command.FilterDescriptors);
total = list.Count();
return (IEnumerable<ProjectDetails>) list.Sort(command.SortDescriptors)
.Page(command.Page - 1, command.PageSize)
.GroupBy(command.GroupDescriptors).ToIList();
}
@model IEnumerable<ProjectDetails>
@{
Html.Telerik()
.Grid(Model)
.Name("ProjectsGrid")
.Sortable()
.Filterable()
.EnableCustomBinding(true)
.DataBinding(dataBinding => dataBinding
.Ajax()
.Select("ReGetIndex", "Projects"))
.Pageable(page => page.Style(GridPagerStyles.PageSizeDropDown | GridPagerStyles.NextPreviousAndNumeric).Total(ViewBag.Total))
.Columns(column =>
{
column.Bound(m => m.Id).Hidden(true);
column.Bound(m => m.Name);
column.Bound(m => m.StatusValue).ClientTemplate("<#= StatusName #>");
})
.Render();
}
if (!command.SortDescriptors.Any())
{
command.SortDescriptors.Add(new SortDescriptor {Member = "YourDefaultProperty"});
}