【问题标题】:Object reference is required + resx-file?需要对象引用 + resx 文件?
【发布时间】:2012-06-08 13:12:15
【问题描述】:

我在国际化我的代码时遇到了问题。除了这部分代码之外,它在我的网站上几乎所有地方都很好用。

[DataType(DataType.Password)]
    [Display(ResourceType = typeof(strings), Name = "BevestigWachtwoord")]
    private CultureInfo resourceCulture;
    [Compare("Password", ErrorMessage = ResourceManager.GetString("PassMismatch",resourceCulture))]
    public string ConfirmPassword { get; set; }

错误(需要对象引用.........)在 ResourceManager.GetString("PassMismatch",resourceCulture))] 如果我尝试 ErrorMessage=strings.PassMismatch (其中字符串是我的资源文件),我会得到同样的错误 当我只填写一个字符串时,它确实有效。 我有同样的显示问题,但我通过这样做解决了这个问题

[Display(ResourceType = typeof(strings), Name = "Email")]

我可以在这里尝试类似的东西吗?

编辑:我的错误

错误 13 非静态字段、方法或属性 'MvcApplication2.Models.RegisterModel.resourceCulture' C:\Users\stuart\documents\visual studio 2010\Projects\MvcApplication2\MvcApplication2\Models 需要对象引用\AccountModels.cs 74 86 MvcApplication2 错误 14 非静态字段、方法或属性需要对象引用 'System.Resources.ResourceManager.GetString(string, System.Globalization.CultureInfo)' C:\Users\stuart\documents\visual studio 2010\Projects \MvcApplication2\MvcApplication2\Models\AccountModels.cs 74 45 MvcApplication2 错误 11 分配给“MvcApplication2.Models.RegisterModel.error”的表达式必须是常量 C:\Users\stuart\documents\visual studio 2010\Projects\MvcApplication2\MvcApplication2\Models\AccountModels.cs 67 30 MvcApplication2 错误 12 属性或索引器“MvcApplication2.strings.PassMismatch”无法在此上下文中使用,因为它缺少获取访问器 C:\Users\stuart\documents\visual studio 2010\Projects\MvcApplication2\MvcApplication2\Models\AccountModels.cs 67 30 MvcApplication2

对于其他评论,我正在尝试类似的东西 ErrorMessage = resourceCulture ResourceManager.GetString("PassMismatch",Thread.CurrentThread.CurrentUICulture))]

但没有任何效果

【问题讨论】:

  • 在将 resourceCulture 传递给 ResourceManager.GetString()...之前,您是否(如果有,如何)分配它?否则你会通过null!
  • 你能发布你得到的异常堆栈跟踪吗?
  • 我不认为它是 null,因为我在 Display 部分的其他本地化工作,即使它是 null,我如何获得 currentCulture?

标签: c# asp.net-mvc internationalization


【解决方案1】:

替换这一行:

[Compare("Password", ErrorMessage = ResourceManager.GetString("PassMismatch",resourceCulture))]

用这一行:

[Compare("Password", ErrorMessageResourceType = typeof(strings), ErrorMessageResourceName = "PassMismatch")]

并确保您已将 PassMismatch 字符串添加到映射到您的 strings 资源类型的资源文件中。

【讨论】:

    【解决方案2】:

    即使您尝试为 ResourceManager 传递静态引用并获取 CurrentCulture:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    using System.Resources;
    using System.Globalization;
    
    namespace QMVC.ViewModel.Home
    {
      public class TResViewModel
      {
        private static ResourceManager r = QMVC.Properties.Resources.ResourceManager;
    
        [Required(ErrorMessage = r.GetString("Test", CultureInfo.CurrentUICulture))]
        public string Test { get; set; }
      }
    }
    

    您将在编译时遇到错误: “属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式”

    换句话说:您不能动态地为属性的参数设置值,因为属性参数必须在编译时解析(这是有道理的)。

    最好(简单)的方法可能是使用其他参数作为验证属性,ErrorMessageResourceType 和 ErrorMessageResourceName:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.ComponentModel.DataAnnotations;
    using System.Resources;
    using System.Globalization;
    
    namespace QMVC.ViewModel.Home
    {
      public class TResViewModel
      {  
        [Required(ErrorMessageResourceType = typeof(QMVC.Properties.Resources), ErrorMessageResourceName = "Test")]
        public string Test2 { get; set; }
    
          }
        }
    

    在验证过程中,将使用您的资源类型、给定键和 CurrentCulture 创建 ErrorMessage。

    问候。

    【讨论】:

    • 感谢您的回复,我不确定如何在我的代码中实现这一点。我已经尝试不使用比较行 [Required(ErrorMessageResourceType = typeof(strings), ErrorMessageResourceName = "PassMisMatch")] 我现在似乎没有收到错误,即使密码不匹配我现在也可以注册,所以它不是比较没有了。
    • 仍然在 ConfirmPassword 上使用比较。仅在密码上使用必需。
    猜你喜欢
    • 2011-03-14
    • 2020-10-22
    • 1970-01-01
    • 2013-09-12
    • 2022-01-17
    • 2023-03-28
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多