目前我正在尝试设置动态DisplayName
属性,但我找不到如何获取属性中当前属性的信息的方法。
这就是我想要实现的目标:
期望的结果
我的属性
public class DisplayNameFromPropertyAttribute : DisplayNameAttribute
{
public DisplayNameFromPropertyAttribute(string propertyName)
: base(GetDisplayName(propertyName))
{
}
private string GetDisplayBame(string propertyName)
{
// Get the value from the given property
}
}
我的模特
我正在尝试将MyDisplayName
中的值读入我的自定义DisplayNameFromProperty
属性
public class MyAwesomeModel
{
public string MyDisplayName { get; set; }
[Required]
[DisplayNameFromProperty("MyDisplayName")]
public string MyValue { get; set; }
}
我的页面
@Html.LabelFor(model => model.MyValue)
@Html.TextBoxFor(model => model.MyValue)
@Html.ValidationMessageFor(model => model.MyValue)
ComponentModel.DataAnnotations
验证属性应使用我的自定义显示名称@Html.LabelFor(model => model.MyValue)
应使用我的自定义显示名称答案 0 :(得分:0)
您可以创建一个cusom HTML扩展方法,让您可以执行@ Html.DictionaryLabelFor(x => x.Property)并从字典中提取
public static IHtmlString DictionaryLabelFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression, string text = null, string prefix = null)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
var displayName = metadata.DisplayName;
if (string.IsNullOrWhiteSpace(text))
{
// Your code to get the label via reflection
// of the object
string labelText = "";
return html.Label(prefix + metadata.PropertyName, labelText);
}
else
{
return html.Label(prefix + metadata.PropertyName, text);
}
}
覆盖这个属性上的属性,唯一缺少的是我编写时不需要的自定义html属性
验证错误消息略有不同,您应该始终为这些字段编写自定义错误,以便您可以在resx中依赖它们,查看模型状态(前缀+键)以获取错误,然后获取每个案例的翻译价值。
您最好避免覆盖标准HTML调用,因为您将在其他地方不需要进行多余调用。
当你有这个工作并理解时,错误消息部分非常容易自己写,取决于你想如何对错误进行格式化。我不是在写它,因为它基本上是为你做的一切,如果你不理解它是如何工作的,那么在编写更多扩展时你将是SOL