{0} 的长度必须至少为 {2} 个字符

The {0} must be at least {2} characters long

我有一个 Visual Studio 2013 MVC Razor 项目,我正在研究 w3schools.com.

上的示例之一

在关于 ASP.NET MVC Security 的章节中,您将在模型 class 中看到默认文件 AccountModels.cs,每个 密码 字段:

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "New password")]
    public string NewPassword { get; set; }

我熟悉String.Format,其中参数必须从0开始递增。

然而,上面的第 2 个参数跳转到 2,似乎没有足够的参数传递给字符串。

在学习项目时,我尽我所能自定义功能(如字符串响应)以更好地加强我的学习。

这是怎么回事?

经过更多调查,我在 ASP.NET Forum by CodeHobo 上找到了一个答案:

You can find the full documentation here

http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.stringlengthattribute.aspx

[StringLength(100, ErrorMessage = "The password must be at least {0} characters", MinimumLength = 6)]

In this case error message is just a string template that is applied when rendered. Think of a string.Format. So it is equivalent to

string.Format("The {0} must be at least {2} characters long.",DisplayName,MaximumLength,MinimumLength);

The 0 index is the display name of the property, 1 is the maximum length, 2 is the minimum length

For your example, this would show the display name instead of the minimum length. You need to change {0} to {2}

[StringLength(100, ErrorMessage = "The password must be at least {0} characters", MinimumLength = 6)]

是的,我可以简单地删除我的问题,但 SO 是我编程信息的主要来源。

如果我在这里找不到编程答案,我觉得它需要它。

我还不是100%理解答案,所以如果有人有更好的答案,我会很乐意接受。

我们基本上是在调用 class:

的构造函数

StringLengthAttribute 是一个 class,其构造函数有一个 int 参数,名为 maximumLength

它还有一些Properties:

  • ErrorMessage 类型 string
    • 在我们的例子中是字符串:"The {0} must be at least {2} characters long."
  • ErrorMessageResourceName 类型 string
    • 在我们的例子中,我们不给它任何值
  • ErrorMessageResourceType 类型 System.Type
    • 在我们的例子中,我们不给它任何值
  • MinimumLength 类型 int
    • 在我们的例子中,我们给它赋值 6

ErrorMessageResourceName 字符串与其他属性(目前)没有任何关系,所以它不是这样的:

String.Format("some variable {0} and some other {1}...", 100, 6)

所以数字 100 和 属性 MinimumLength = 6 根本没有 (还)发送的参数用字符串格式化"The {0} must be at least {2} characters long."

classStringLengthAttribute也有一些方法,其中一种叫做FormatErrorMessage

此方法在内部调用以格式化消息,它在内部使用 String.Format 格式化字符串,这里是将参数传递给要正确格式化的字符串。

  • {0} 绑定到 DisplayName
  • {1} 绑定到 MaximumLength
  • {2} 绑定到 MinimumLength

这是内部调用的方法(如果您想知道它在内部是如何调用的):

/// <summary>
    /// Override of <see cref="ValidationAttribute.FormatErrorMessage"/>
    /// </summary>
    /// <param name="name">The name to include in the formatted string</param>
    /// <returns>A localized string to describe the maximum acceptable length</returns>
    /// <exception cref="InvalidOperationException"> is thrown if the current attribute is ill-formed.</exception>
    public override string FormatErrorMessage(string name) {
        this.EnsureLegalLengths();

        bool useErrorMessageWithMinimum = this.MinimumLength != 0 && !this.CustomErrorMessageSet;

        string errorMessage = useErrorMessageWithMinimum ?
            DataAnnotationsResources.StringLengthAttribute_ValidationErrorIncludingMinimum : this.ErrorMessageString;

        // it's ok to pass in the minLength even for the error message without a {2} param since String.Format will just
        // ignore extra arguments
        return String.Format(CultureInfo.CurrentCulture, errorMessage, name, this.MaximumLength, this.MinimumLength);
    }

参考文献:

  • Microsoft 参考源 here
  • 关于 Whosebug 的类似问题:"What parameters does the stringlength attribute errormessage take?" here
  • StringLengthAttribute Class here
  • 几乎无用的 msdn 文档