2010-04-22 25 views
3

我有以下代碼來生成一個列表,並允許開發人員根據需要自定義輸出。從MVC中的lambda呈現Html

<% Html.List<MyList>(item => item.Property).Value(item => return "<div>" + item.Property + "<br/>" + item.AnotherProperty + "</div>").Render() %> 

這不是理想的,我怎麼能允許開發者添加類似於其他控件的HTML。

<% Html.List<MyList>(item => item.Property).Value(item => %> <div><%=item.Property%><br/><%=item.AnotherProperty%></div><%).Render() %> 

這種方式是非常乾淨和標準的其餘mvc。

+0

爲什麼不在視圖中使用循環?你所做的只是抽象foreach,並強迫程序員連接字符串而不是寫標記。 – Ryan 2010-04-22 22:10:15

+0

我已經將實際組件簡化爲需要幫助的部分 – Thad 2010-04-22 22:19:04

回答

2

<%=%>標記只是Response.Write的快捷方式。如果你仔細想想,lambda表達式只是簡單地讓你延遲執行Response.Write代碼,直到適當的時間。

所以,最重要的部分是調用Response.Write來構建你的列表,並且當它是時候注入自定義模板的時候,我只需執行一個Response.Write來注入模板的lambda。

下面是一些示例代碼,以幫助說明:

public class TableBuilder 
{ 
    private Action<int> _template; 

    public TableBuilder Template(Action<int> template) 
    { 
     _template = template; 
     return this; 
    } 

    public void Render() 
    { 
     var r = HttpContext.Current.Response; 

     r.Write("<table>"); 

     for(int i=0; i<10; ++i) 
     { 
      r.Write("<tr><td>"); 
      if(_template != null) 
      { 
       _template(i); 
      } 
      r.Write("</td></tr>"); 
     } 

     r.Write("</table>"); 
    } 
} 

然後,使用助手,請執行以下操作:

<body> 
    <div> 
    <% Html.TableBuilder().Template(i => { %> 

              <%= i %>: I'm a template 

         <% }).Render(); %> 
    </div> 
</body> 

這是一個巧妙的方法!

+0

+1有一個很好的答案,儘管我認爲最後的語法比字符串連接更醜陋 – 2010-04-27 17:58:27

+0

我同意,這很醜陋! – 2010-04-28 02:11:47