自定义数据注释和视图模型



我编写了一个自定义的DataAnnotation,它工作得非常好,除非我使用ViewModel而不是实际的Model本身。

对于Model,数据注释呈现如下效果:

<label class="tooltip" for="title">Enter a title.</label>

当我使用ViewModel时,数据注释仍然呈现相同的东西。这里的问题是"for"应该是"Product_title"而不是"title"。

下面是我编写的从数据注释中呈现标签的HTMLHelper:

(取自asp.net MVC扩展dataannotations)

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。

那么,是否有一个属性可以用来代替"Member "呢?Name",总是返回正确的ID,或者我必须用JavaScript解决这个问题(如果其他一切都失败了,我可以这样做)?

我最近实现了类似的东西,获取Display注释的"Description"属性并将其输出到屏幕:

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

我将这些帮助程序输出到工具提示类型控件。我考虑过实现我自己的工具提示属性,但它似乎超出了我的需要…

相关内容

  • 没有找到相关文章

最新更新