【问题标题】:Applying user-specified datetime settings across in an MVC model在 MVC 模型中应用用户指定的日期时间设置
【发布时间】:2012-11-29 04:06:39
【问题描述】:

我有一个在用户登录时实例化的用户对象,这个对象存储了所有用户的设置:

public class SiteUser
{

    public string LoginId { get; set; }
    public string Name { get; set; }        
    public DateTime PasswordChangedOn { get; set; }
    public string Language { get; set; }
    public string DateFormat { get; set; }
    public string RoleName { get; set; }        
    public ICollection<SitePermission> SitePermissions { get; set; }
}

还有一个UserContext类,用来存储和管理用户的会话

   public class UserContext
   {
         public SiteUser SiteUser { get; internal set; }

         public static UserContext Current
         {
                get
                {
                    if (HttpContext.Current == null || HttpContext.Current.Session == null)
                        return null;

                    if (HttpContext.Current.Session["UserContext"] == null)
                        CreateUserContext();

                    return (UserContext)HttpContext.Current.Session["UserContext"];
                }
            }
    }

现在,每当我必须显示日期时,无论是在网格中还是在文本字段中,我总是希望引用 SiteUser 对象的 DateFormat 属性。

在我看到的大多数示例中,数据注释都用于定义日期的格式:

    [DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime PasswordChangedOn { get; set; }

我试过修改成这样:

[DataType(DataType.Date), DisplayFormat(DataFormatString = UserContext.Current.SiteUser.DateFormat, ApplyFormatInEditMode = true)]

但它不起作用,给我一个错误,指出属性参数必须是一个常量。

那么在 MVC 应用程序中将日期格式设置为模型的最佳方法是什么?

【问题讨论】:

    标签: c# model-view-controller datetime model data-annotations


    【解决方案1】:

    您可以在视图模型中添加一个属性并使用它来呈现日期,而不是考虑用户特定日期并在视图中呈现它,例如

    public string PasswordChangedOnLocal
    {
        get { return PasswordChangedOn.ToString(DateFormat); }
    }
    

    或者,您可以使用DateFormat 属性在视图本身中呈现日期。如果以后想更改它(例如,采用系统范围的约定),这实际上为您提供了更多的灵活性,因为您不需要重新编译站点,例如

    @model SiteUser
    
    ...
    <div id="passwordChangedOn">@Model.PasswordChangedOn.ToString(Model.DateFormat)</div>
    ...
    

    【讨论】:

    • 那么,我需要在我的模型中为我的所有日​​期时间属性添加第二个属性吗?例如,如果我在 20 个不同的模型中有 50 个日期时间属性,我将不得不为每个模型添加一个“OnLocal”变体?
    • 我知道您的解决方案可以胜任这项工作,但有没有更统一的方法呢?我实际上喜欢 MVC 的日期样式方式,唯一的缺点是……格式必须是硬编码的
    • @ParityBit 您的 50 个日期时间属性的问题会为您解决同样的问题,无论您采取何种方式,因为所有这些日期都需要手动格式化。通过引入基类可以轻松解决 20 种不同的模型。如果您有多个属性字段,那么我认为直接在视图中执行可能是最好的选择。
    • @ParityBit 如果您不反对使用 3rd 方库,另一种选择是 AutoMapper。您可以将自定义格式化程序应用于特定类型等。
    猜你喜欢
    • 2014-04-20
    • 2011-04-11
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多