自定义数据注释和;的ViewModels

时间:2011-09-09 19:25:47

标签: asp.net asp.net-mvc viewmodel data-annotations

我编写了一个自定义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解决这个问题(我可以做到这一切,如果一切否则失败)?

1 个答案:

答案 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);
    }

我将这些帮助器输出到工具提示类型控件。我考虑过实现自己的工具提示属性,但它似乎比我需要的更多......