2012-02-14 74 views
0

我必须编写大量代码来从类生成Knockout JS模板。如何编写一个与类一起工作的HTML助手

说这句话...

<li><span>Surname</span> <span data-bind="text: SURNAME"></span></li> 

我想与像剃刀模板调用哪个...

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

甚至

@DisplayMeFor<className>(c=>c.SURNAME) 

但我真的很想知道从哪里开始。我清楚需要做一些仿制药读了,但我认为这将是这样的......

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(......不编译

任何指针请

回答

1

我想出了解决的办法是

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

被称为

@(Exts.TemplateFor<MyClass>(a=>a.MyField,true)) 
0

尝试创建自己的扩展方法的HtmlHelper代替的TModel:?

public static class HtmlExtensions 
{ 
    public static MvcHtmlString DisplayMeFor<TModel, TValue>(this HtmlHelper htmlHelper, Expression<Func<TModel, TValue>> expression) 
    { 
     // your code here 
    } 
} 

在剃刀,只需调用你的方法:

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

+0

,我不认为这会工作,因为这些模板,因为没有@model我们没有在MVC中绑定它们 - 我们将它们与Knockout.js绑定 – Andiih 2012-02-14 15:03:35