根据使用httpcontext asp.net mvc登录的用户获取时区

古鲁帕萨德·J·饶

在正在处理的应用程序中,我们为每个用户提供了一个选项,供他们选择自己的选项,timezone并且在为特定用户显示数据时,我们会抓取timezone他的选择并进行相应显示。现在,按照此处提到的答案,这确实是一个了不起的答案,我继续实现了上述选项,即按model级别转换日期,并且按如下方式进行:

NotificationViewModel.cs

public class NotificationViewModel
{

    public string Text{ get; set; }
    public DateTime Moment
    {
        get
        {
            return _Created;
        }
        set
        {
            _Created = Repository.GetUserTimeZoneDateTime(value);
        }
    }
    private DateTime _Created { get; set; }
    public string Icon { get; set; }
}

Repository.cs

GetUserTimeZoneDateTime 有2个重载

public static DateTime GetUserTimeZoneDateTime(DateTime dTime)
{
    using (var context = new EntityContext())
    {
         var tZone = context.tbl_usrs.AsNoTracking().FirstOrDefault(x => x.uname == HttpContext.Current.User.Identity.Name).preferred_timezone;
         var tZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tZone);
         return TimeZoneInfo.ConvertTimeFromUtc(dTime, tZoneInfo);
    }
}

public static DateTime GetUserTimeZoneDateTime(EntityContext context, DateTime dTime)
{
    var tZone = context.tbl_usrs.AsNoTracking().FirstOrDefault(x => x.uname == HttpContext.Current.User.Identity.Name).preferred_timezone;
    var tZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tZone);
    return TimeZoneInfo.ConvertTimeFromUtc(dTime, tZoneInfo);
}

在上述情况下的过载第一将被调用,但随后,从调用时model电平,HttpContext.Currentnull因此它失败。


在第二种方法中,我尝试过,timezone将从控制器级别获取。

NotificationViewModel.cs

public class NotificationViewModel
{
    public string Text { get; set; }
    public DateTime Moment { get; set; }
    public string Icon { get; set; }
}

TestController.cs

using (var context = new EntityContext())
{
     var localTime = Repository.GetUserTimeZoneDateTime(context, DateTime.UtcNow);
     List<NotificationViewModel> model = new List<NotificationViewModel>();
     int days = DateTime.UtcNow.DayOfWeek - DayOfWeek.Sunday;
     DateTime weekStart = localTime.AddDays(-days);
     DateTime weekEnd = weekStart.AddDays(6);
     var p = context.tbl_prchs
                     .Where(x => x.c_date <= weekEnd && x.c_date >= weekStart)
                     .Select(x => new NotificationViewModel()
                     {
                           Icon = "fa fa-gbp",
                           Moment = Repository.GetUserTimeZoneDateTime(context,x.c_date),
                           Text = "Test notes",
                     }).ToList();
     model.AddRange(p);
}

var localTime = Repository.GetUserTimeZoneDateTime(context, DateTime.UtcNow);datetime根据首选用户获取适当的信息timezone但是然后Moment= Repository.GetUserTimeZoneDateTime(context,x.c_date),里面linq expression抛出错误如下

LINQ to Entities无法识别方法'System.DateTime GetUserTimeZoneDateTime(Direct_Commercial_Van.Models.EntityDataModel.dcvEntities,System.DateTime)'方法,并且该方法无法转换为商店表达式。

这是预期的。我还可以在这里尝试哪些其他选项来实现这一目标?或者如何以其他方式在这里处理时区问题?

用户名

在第一种情况下,您需要通过模型中的附加参数HttpContext(或User.Identity.Name)注入模型(查看构造函数),然后从模型中注入方法非常凌乱,不建议这样做)。

在第二种情况下,您需要先实现查询,然后再执行 .Select()

var p = context.tbl_prchs
    .Where(...)
    .ToList() // materialize query in in-memory set
    .Select(x => new NotificationViewModel()
    {
    }).ToList();

但是,您的代码效率很低,因为您GetUserTimeZoneDateTime()针对查询所返回的每一行(通过方法)调用数据库您应该TimeZoneInfo在调用查询之前更改代码以获取

// Get the time zone info
var tZone = context.tbl_usrs.AsNoTracking().......'
var tZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tZone);
// Generate the view model
var p = context.tbl_prchs
    .Where(...)
    .ToList() // materialize query in in-memory set
    .Select(x => new NotificationViewModel()
    {
        ....
        Moment = TimeZoneInfo.ConvertTimeFromUtc(x.c_date, tZoneInfo);
    }).ToList();

或者,如果您不想首先实现查询,则可以将注入TimeZoneInfo到您的视图模型中,然后将修改Moment为计算所得的属性。

public class NotificationViewModel
{
    public string Text { get; set; }
    public DateTime CDate { get; set; }
    public string Icon { get; set; }
    public TimeZoneInfo TimeZoneInfo { get; set; }
    public DateTime Moment
    {
        get { return TimeZoneInfo.ConvertTimeFromUtc(CDate, TimeZoneInfo); }
    }
}

然后查询将是

....
var tZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tZone);
var p = context.tbl_prchs
    .Where(...)
    .Select(x => new NotificationViewModel()
    {
        ....
        CDate = x.c_date,
        TimeZoneInfo = tZoneInfo
    }).ToList();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ASP.NET MVC-获取用户的登录状态

来自分类Dev

使用ASP.NET Core MVC获取用户输入

来自分类Dev

如何授权在Asp.Net MVC中使用外部登录名登录的用户

来自分类Dev

防止没有确认电子邮件的用户使用身份2登录ASP.Net MVC

来自分类Dev

如何使用ASP.NET MVC 4强制用户登录以查看任何内容

来自分类Dev

即使用户已登录,CustomAuthorizeAttribute也会重定向到LoginView(ASP.Net MVC 5)

来自分类Dev

成功登录的用户使用 ASP.NET MVC CookieAuthentication 不断被重定向到 AccessDeniedPath

来自分类Dev

具有ASP.NET标识的MVC 5-用户登录时获取声明

来自分类Dev

在Asp.Net MVC 5中获取已登录用户的UserID

来自分类Dev

获取ASP.NET Core MVC中当前登录用户的角色

来自分类Dev

ASP.NET MVC4获取登录用户的电子邮件

来自分类Dev

从登录用户获取产品时出错。ASP.NET Core MVC

来自分类Dev

我如何获取登录asp.net mvc的用户的userId或MembershipId

来自分类Dev

获取登录用户角色:Asp.net MVC5

来自分类Dev

如何获取登录到我的ASP.NET MVC网站的当前用户的名称?

来自分类Dev

ASP.NET MVC 用户使用

来自分类Dev

ASP.NET MVC FormsAuthentication检查用户是否登录

来自分类Dev

用户“ sa”的ASP.NET MVC页面登录失败

来自分类Dev

ASP.NET 5 MVC 6-登录用户

来自分类Dev

用户“ sa”的ASP.NET MVC页面登录失败

来自分类Dev

ASP.Net MVC 后端如何知道用户是否登录

来自分类Dev

使用ASP.NET MVC 6 WebAPI从Auth0获取用户信息

来自分类Dev

C#ASP .NET; 获取登录用户的NetworkCredential对象?

来自分类Dev

如何使用AspNet.Identity使用Asp.Net MVC5 RTM位登录/认证用户?

来自分类Dev

为什么ASP.NET Core MVC 3.1项目不会让我使用Identity使用注册用户登录

来自分类Dev

使用ASP.NET MVC Identity 2.0播种和登录默认用户的适当位置在哪里?

来自分类Dev

ASP.Net MVC 5如何与多个登录一起使用授权属性(多个用户表)

来自分类Dev

如何通过接口获取当前登录的用户名,以在asp.net core mvc中按列插入更新?

来自分类Dev

如何在asp.net MVC中获取登录的用户ID并在隐藏的文本框中显示它

Related 相关文章

  1. 1

    ASP.NET MVC-获取用户的登录状态

  2. 2

    使用ASP.NET Core MVC获取用户输入

  3. 3

    如何授权在Asp.Net MVC中使用外部登录名登录的用户

  4. 4

    防止没有确认电子邮件的用户使用身份2登录ASP.Net MVC

  5. 5

    如何使用ASP.NET MVC 4强制用户登录以查看任何内容

  6. 6

    即使用户已登录,CustomAuthorizeAttribute也会重定向到LoginView(ASP.Net MVC 5)

  7. 7

    成功登录的用户使用 ASP.NET MVC CookieAuthentication 不断被重定向到 AccessDeniedPath

  8. 8

    具有ASP.NET标识的MVC 5-用户登录时获取声明

  9. 9

    在Asp.Net MVC 5中获取已登录用户的UserID

  10. 10

    获取ASP.NET Core MVC中当前登录用户的角色

  11. 11

    ASP.NET MVC4获取登录用户的电子邮件

  12. 12

    从登录用户获取产品时出错。ASP.NET Core MVC

  13. 13

    我如何获取登录asp.net mvc的用户的userId或MembershipId

  14. 14

    获取登录用户角色:Asp.net MVC5

  15. 15

    如何获取登录到我的ASP.NET MVC网站的当前用户的名称?

  16. 16

    ASP.NET MVC 用户使用

  17. 17

    ASP.NET MVC FormsAuthentication检查用户是否登录

  18. 18

    用户“ sa”的ASP.NET MVC页面登录失败

  19. 19

    ASP.NET 5 MVC 6-登录用户

  20. 20

    用户“ sa”的ASP.NET MVC页面登录失败

  21. 21

    ASP.Net MVC 后端如何知道用户是否登录

  22. 22

    使用ASP.NET MVC 6 WebAPI从Auth0获取用户信息

  23. 23

    C#ASP .NET; 获取登录用户的NetworkCredential对象?

  24. 24

    如何使用AspNet.Identity使用Asp.Net MVC5 RTM位登录/认证用户?

  25. 25

    为什么ASP.NET Core MVC 3.1项目不会让我使用Identity使用注册用户登录

  26. 26

    使用ASP.NET MVC Identity 2.0播种和登录默认用户的适当位置在哪里?

  27. 27

    ASP.Net MVC 5如何与多个登录一起使用授权属性(多个用户表)

  28. 28

    如何通过接口获取当前登录的用户名,以在asp.net core mvc中按列插入更新?

  29. 29

    如何在asp.net MVC中获取登录的用户ID并在隐藏的文本框中显示它

热门标签

归档