我编写了一个自定义DataAnnotation,除非我使用ViewModel而不是实际的Model本身,否则它的工作方式非常好。
使用模型,数据注释会产生以下效果:
<label class="tooltip" for="title">Enter a title.</label>
当我使用ViewModel时,数据注释仍然呈现相同的东西。这里的问题是“for”应该是“Product_title”而不是“title”。
这是我写的HTMLHelper,它从数据注释中呈现标签:
(取自asp.net MVC extending DataAnnotions)
public static MvcHtmlString TooltipFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) {
var exp = (MemberExpression)expression.Body;
foreach (Attribute attribute in exp.Expression.Type.GetProperty(exp.Member.Name).GetCustomAttributes(false)) {
if (typeof(Tooltip) == attribute.GetType()) {
return MvcHtmlString.Create("<label class=\"tooltip\" for=\"" + exp.Member.Name + "\">" + ((Tooltip)attribute).Description + "</label>");
}
}
return MvcHtmlString.Create("");
}
我在表达式对象中挖掘出来以确定哪个属性包含模型属性名称,该属性名称最终将成为输入ID; “exp.Member.Name”。
现在我正在使用ViewModel,我显然需要一些不同的东西,因为“exp.Member.Name”仍然返回“title”而不是“Product_title”,它最终成为输入字段的ID。 / p>
那么,是否有我可以使用的属性,我可以使用而不是“Member.Name”,它将始终返回正确的ID,或者我将不得不用JavaScript解决这个问题(我可以做到这一切,如果一切否则失败)?
答案 0 :(得分:0)
我最近实现了类似的功能,获取了显示注释的“描述”属性并将其输出到屏幕:
public static MvcHtmlString DescriptionFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression) {
var metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
var description = metadata.Description;
return MvcHtmlString.Create(description);
}
我将这些帮助器输出到工具提示类型控件。我考虑过实现自己的工具提示属性,但它似乎比我需要的更多......