我正在通过浏览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,并且似乎没有足够的参数传递给字符串。
在学习项目时,我尽我所能来自定义功能(如字符串响应)以更好地加强我的学习。
答案 0 :(得分:3)
经过一番调查后,我在ASP.NET Forum by CodeHobo上发现了答案:
您可以在此处找到完整的文档
[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
是一个类,其构造函数有一个名为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
在内部格式化字符串,这里是将参数传递给字符串以便正确格式化。
这是内部调用的方法(如果你想知道它内部是如何做的):
String.Format
参考文献:
/// <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