首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写与类一起工作的HTML Helper

如何编写与类一起工作的HTML Helper
EN

Stack Overflow用户
提问于 2012-02-14 22:55:33
回答 2查看 158关注 0票数 0

我必须编写大量代码,以便从类生成Knockout JS模板。

说这样的话。

代码语言:javascript
复制
 <li><span>Surname</span> <span data-bind="text: SURNAME"></span></li>

我想在剃刀模板中调用它,比如...

代码语言:javascript
复制
 @className.DisplayMeFor(c=>c.SURNAME)

甚至是

代码语言:javascript
复制
 @DisplayMeFor<className>(c=>c.SURNAME)

但是我真的被卡住了,不知道从哪里开始。我显然需要阅读一些泛型的知识,但我认为应该是这样的……

代码语言:javascript
复制
public static class HtmlExtensions
{
    public static MvcHtmlString DisplayMeFor<TModel, TValue>(this TModel htmlHelper,   Expression<Func<TModel, TValue>> expression)
    {
        var s = expression.ToString(); //Clearly need a lot more code here to get name, DisplayName etc
        return MvcHtmlString.Create(s);
    }
}

但这并没有提供对模型的扩展(即@vmAppeal.DisplayMeFor(...不编译。

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-21 22:44:05

我想出的解决方案是

代码语言:javascript
复制
public static class Exts
{
    private const string Input = @"<div><span>{0} : </span><input data-bind='value: {1}'></input></div>";
    private const string Display = @"<div><span>{0} : </span><span data-bind='text: {1}'></span></div>";
    private const string DatePicker = @"<div><span>{0} : </span><input data-bind='datepicker: {1}, datepickerOptions: {{  dateFormat: ""dd/mm/yy""}}' /></div>";

    public static MvcHtmlString TemplateFor<TModel>(Expression<Func<TModel, object>> expression, bool edit) where TModel : class  , new()
    {
        var data = new ViewDataDictionary<TModel>();
        var metadata = ModelMetadata.FromLambdaExpression(expression, data);
        var typ = metadata.ModelType;

        var s = edit? Input: Display;
        if (typ == typeof(System.DateTime) ||typ == typeof(System.DateTime?))
        {
            s = edit ? DatePicker : Display;
        }
        return MvcHtmlString.Create(string.Format(s, metadata.GetDisplayName(), metadata.PropertyName));
    }
}

它被称为

代码语言:javascript
复制
@(Exts.TemplateFor<MyClass>(a=>a.MyField,true))
票数 1
EN

Stack Overflow用户

发布于 2012-02-14 23:00:31

尝试为HtmlHelper而不是TModel创建扩展方法:

代码语言:javascript
复制
public static class HtmlExtensions
{
    public static MvcHtmlString DisplayMeFor<TModel, TValue>(this HtmlHelper htmlHelper,   Expression<Func<TModel, TValue>> expression)
    {
         // your code here
    }
}

在razor中,只需调用您的方法:

@Html.DisplayMeFor(c=>c.SURNAME)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9279059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档