在ActionResult和View之间转换数据

时间:2016-11-29 08:32:18

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

在我的项目中,我使用kendo网格来显示数据,在我的ActionResult中,我使用此代码来获取数据:

public ActionResult ShowData([DataSourceRequest] DataSourceRequest request, long studentid)
{
    IQueryable<Models.Registration.RegistrationModel>
        query =
        from financeItem in db.RegistrationItems

        select new Models.Registration.RegistrationModel
        {
            RegisterId = financeItem.RegistrationId,
            Id = financeItem.Registration.Id,
            Date = financeItem.Registration.Date,

            StudentName = financeItem.Registration.Student.FirstName + " " + financeItem.Registration.Student.LastName
        };
    DataSourceResult dsr = query.ToDataSourceResult(request);

    return Json(dsr, JsonRequestBehavior.AllowGet);
}

所以。我需要转换日期到本地日期,我有一个问题。 这是我的问题: 当我想在查询中转换日期时我得到很多错误,linq2sql无法找到转换器功能。所以我将查询类型从IQueryable更改为list并尝试转换。但我有时间错误,因为我有很多记录。 在此错误之后,我尝试在viewmodel中的get和set属性中转换数据,如下代码:

public string DateSs
{
    get
    {

        return DateConvertor(Date.ToString());
    }
    set { value.ToString(); }
}

我在视图中使用此属性并显示转换后的数据。 到目前为止一切正常但是当我想在kendo网格中使用过滤器部分并根据输入日期过滤数据时,我得到并且错误表明此文件未在查询中退出。 所以我有头痛,我不知道我该怎么做以及如何转换这个贵妇人日期

1 个答案:

答案 0 :(得分:1)

对于剑道网格,您的日期列代表 DateSs 而非日期。当它尝试在Date上应用过滤器时,它会在DateSs上应用过滤器,该过滤器不存在于数据库表中,如果在查询中定义则会抛出错误。

我认为解决方法是在应用 ToDataSourceResult 之前拦截 DataSourceRequest 并相应地更改值和过滤器名称

<强>更新

过滤器Kendo Grid发送的是请求。过滤器但结构是分层的,以便在一个请求中支持多个过滤器。所以,首先你可能想要将过滤器展平,你可以使用这个代码,

public static IEnumerable<IFilterDescriptor> FlattenFilters(this DataSourceRequest request)
{
        return request.Filters
            .RecursiveSelect(
                descriptor => (descriptor as CompositeFilterDescriptor)?.FilterDescriptors ?? Enumerable.Empty<IFilterDescriptor>(),
                descriptor => descriptor as FilterDescriptor)
            .Where(x => x != null);
}

此函数将返回当前应用的所有过滤器的Enumerable。然后你可以像这样更改过滤器的名称

request.FlattenFilters().Each(x =>
{
            FilterDescriptor filter = x as FilterDescriptor;
            if (filter != null && filter.Member == "DateSs")
            {
                filter.Member = "Date";

                //Change the filter.Value property according to your case
                //i.e. It would be in String and you might want to convert it to date too.
            }
});