Ira*_*ili 23 c# html-helper razor asp.net-mvc-4
我在ASP.NET MVC 4 razor视图引擎C#中创建了HtmlHelper.
我可以将视图模型属性传递给我的帮助器类吗?
例如,我有财产
[Required]
[Display(Name = "Your Lastname")]
public string Lastname { get; set; }
Run Code Online (Sandbox Code Playgroud)
我可以将此属性传递给我的帮助器@Html.Example(model => model.Lastname),然后在帮助器中获取数据注释(如果需要此字段,则显示名称等等)?
Dar*_*rov 39
该[Display]属性丰富了元数据.因此,您可以从元数据中获取信息.
例如,如果要检索帮助程序中的显示名称:
public static class HtmlHelpers
{
public static IHtmlString Example<TModel, TProperty>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> ex
)
{
var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
var displayName = metadata.DisplayName;
return new HtmlString(html.Encode(displayName));
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们假设你有一个视图模型:
public class MyViewModel
{
[Required]
[Display(Name = "Your Lastname")]
public string Lastname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您可以在强类型视图中使用帮助器:
@model MyViewModel
@Html.Example(x => x.Lastname)
Run Code Online (Sandbox Code Playgroud)
现在让我们假设你编写了一个自定义元数据属性:
public class FooBarAttribute : Attribute, IMetadataAware
{
public FooBarAttribute(string bar)
{
Bar = bar;
}
public string Bar { get; private set; }
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["foo"] = Bar;
}
}
Run Code Online (Sandbox Code Playgroud)
您曾经用以下方法装饰您的模型:
public class MyViewModel
{
[Required]
[FooBar("This is the bar")]
public string SomeBar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后在你的助手里面你可以获取自定义属性:
public static class HtmlHelpers
{
public static IHtmlString Example<TModel, TProperty>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> ex
)
{
var metadata = ModelMetadata.FromLambdaExpression(ex, html.ViewData);
if (metadata.AdditionalValues.ContainsKey("foo"))
{
var foo = metadata.AdditionalValues["foo"] as string;
return new HtmlString(html.Encode(foo));
}
return MvcHtmlString.Empty;
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
您似乎需要获取Required消息.不知道为什么你需要在自定义帮助器中执行此操作,但这是一个示例,您可以如何实现:
public static class HtmlHelpers
{
public static IHtmlString Example<TModel, TProperty>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> ex
)
{
var me = (ex.Body as MemberExpression);
if (me != null)
{
var required = me
.Member
.GetCustomAttributes(typeof(RequiredAttribute), false)
.Cast<RequiredAttribute>()
.FirstOrDefault();
if (required != null)
{
var msg = required.FormatErrorMessage(me.Member.Name);
return new HtmlString(html.Encode(msg));
}
}
return MvcHtmlString.Empty;
}
}
Run Code Online (Sandbox Code Playgroud)