2012-02-14 72 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