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

时间:2015-01-12 21:06:43

标签: asp.net-mvc razor visual-studio-2013

我正在通过浏览w3schools.com上的一个示例来学习Visual Studio 2013 MVC Razor项目。

ASP.NET MVC Security一章中,您将在Models类中看到默认文件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,并且似乎没有足够的参数传递给字符串。

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

这里发生了什么?

pictures rock

2 个答案:

答案 0 :(得分:3)

经过一番调查后,我在ASP.NET Forum by CodeHobo上发现了答案:

  

您可以在此处找到完整的文档

     

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

     

[StringLength(100,ErrorMessage =“密码必须至少为{0}个字符”,MinimumLength = 6)]

     

在这种情况下,错误消息只是呈现时应用的字符串模板。想想一个string.Format。所以它相当于

     

string.Format(“{0}必须至少{2}个字符。”,DisplayName,MaximumLength,MinimumLength);

     

0索引是属性的显示名称,1是最大长度,2是最小长度

     

对于您的示例,这将显示显示名称而不是最小长度。您需要将{0}更改为{2}

     

[StringLength(100,ErrorMessage =“密码必须至少为{0}个字符”,MinimumLength = 6)]

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

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

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

答案 1 :(得分:3)

StringLengthAttribute class constructor

我们基本上是在调用类的构造函数:

StringLengthAttribute是一个类,其构造函数有一个名为int的{​​{1}}参数

它还有一些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."也有一些方法,其中一种称为StringLengthAttribute

在内部调用此方法来格式化消息,并使用FormatErrorMessage在内部格式化字符串,这里是将参数传递给字符串以便正确格式化。

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

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

String.Format

参考文献:

  • Microsoft参考源here
  • 关于Stackoverflow的类似问题:&#34; stringlength属性错误消息采用什么参数?&#34; here
  • /// <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); } here
  • 几乎无用的msdn文档