4

我正在使用 MVC 和 CodeFirst 创建一个多语言网站,并且我遵循了本教程(http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating -an-entity-framework-data-model-for-an-asp-net-mvc-application)但我遇到了一些问题......</p>

我会尽量详细解释,抱歉问题太长了……</p>

假设我有一个实体 T 具有以下属性(日期、名称),其中 name 属性应该本地化;我构建了以下实体来表示实体及其本地化版本:

public class T
{
    #region Primitive Properties

    public int TID { get; set; }

    [DisplayFormat(DataFormatString = "{0:d}")]
    [Required]
    public DateTime DateCreated { get; set; }

    #endregion

    #region Localized Properties

    protected T_Locale TWithCurrentLocaleOrCreate
    {
        get
        {
            T_Locale t = this.T_Locales.SingleOrDefault(record => record.LocaleID == Locale.CurrentLocale.LocaleID);
            // If the object is not available with the current locale,
            // create it
            if (t == null)
            {
                t = new T_Locale
                {
                    Locale = Locale.CurrentLocale
                };

                this.T_Locales.Add(t);
            }

            return t;
        }
    }

    protected T_Locale TWithCurrentLocaleOrDefault
    {
        get
        {
            T_Locale t = this.T_Locales.SingleOrDefault(record => record.LocaleID == Locale.CurrentLocale.LocaleID);
            // If the object is not available with the current locale,
            // return it with the default locale
            if (t == null)
            {
                t = this.T_Locales.SingleOrDefault(record => record.LocaleID == Locale.DefaultLocale.LocaleID);
                // If the object is not available with the current locale,
                // return it with any available locale
                if (t == null)
                    t = this.T_Locales.First();
            }

            return t;
        }
    }

    [NotMapped]
    public string Name
    {
        get
        {
            return this.TWithCurrentLocaleOrDefault.Name;
        }
        set
        {
            this.TWithCurrentLocaleOrCreate.Name = value;
        }
    }

    #endregion

    #region Navigation Properties

    public virtual ICollection<T_Locale> T_Locales { get; set; }

    #endregion
}


public class T_Locale
{
    #region Primitive Properties

    [Key]
    [Column(Order = 0)]
    public int TID { get; set; }

    [Key]
    [Column(Order = 1)]
    public int LocaleID { get; set; }

    [Required]
    public string Name { get; set; }

    #endregion

    #region Navigation Properties

    public virtual T T { get; set; }

    public virtual Locale Locale { get; set; }

    #endregion
}


public class Locale
{
    #region Primitive Properties

    public int LocaleID { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string DisplayName { get; set; }

    #endregion

    #region Navigation Properties

    public virtual ICollection<T_Locale> T_Locales { get; set; }

    #endregion

    #region Current Locale Properties

    protected static string DefaultLocaleName
    {
        get
        {
            return "en";
        }
    }

    private static Locale _DefaultLocale;
    public static Locale DefaultLocale
    {
        get
        {
            DatabaseContext database = new DatabaseContext();
            _DefaultLocale = database.Locales.SingleOrDefault(record => record.Name == Locale.DefaultLocaleName);

            return _DefaultLocale;
        }
    }

    private static Locale _CurrentLocale;
    public static Locale CurrentLocale
    {
        get
        {
            DatabaseContext database = new DatabaseContext();

            if (_CurrentLocale == null)
            {
                // To Avoid the large logic behind for getting the current locale I’m using the default one here…
                _CurrentLocale = Locale.DefaultLocale;
            }

            return _CurrentLocale;
        }
    }

    #endregion
}

其中 T: 是我感兴趣的实体,而 T_Locale 是 T 的本地化版本,仅包含应本地化的属性,您可能会注意到我在 T (Name) 中编写了一个 NotMapped 属性来获取属性名称的当前本地化版本... 此属性应返回具有当前语言环境的名称,并且在调用 setter 时,应修改具有当前语言环境的名称的值。

我已经为带有 Razor 视图的 T 创建了一个控制器,并且没有任何进一步的修改,当导航到创建视图时,我得到了正确的视图,但是当单击创建按钮时,我遇到了来自方法“TWithCurrentLocaleOrDefault”的异常我注意到在调用 setter 之前,它是从 Name 属性的 getter 中调用的……并且由于刚刚创建的 T 实例没有本地化版本,因此我从该方法中得到了异常。

我不知道我是否在这里遗漏了一些东西,或者我是否使用了错误的逻辑,所以请你向我解释什么是错的,或者指出一个很好的教程或示例代码来处理使用 Mvc 进行本地化。

更新:

问题是我正在创建多个 Context 实例,所以我想我应该更改在访问任何本地化实体的当前本地化实例时使用的逻辑(T 的当前 T_Locale),如果有任何好的逻辑要处理有这种情况请指点...

再次抱歉这个很长的问题,任何帮助将不胜感激,并在此先感谢。

4

1 回答 1

0

我决定使用 Griffin 本地化,因为它很容易实现,也很容易管理。关于代码项目有一个非常好的教程:Localization in ASP.NET MVC with Griffin.MvcContrib

于 2013-04-29T10:23:45.080 回答