Рендеринг HTML из лямбды в MVC - PullRequest
3 голосов
/ 23 апреля 2010

У меня есть следующий код для генерации списка, и разработчики могут настроить вывод при необходимости.

<% 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.

1 Ответ

2 голосов
/ 23 апреля 2010

Теги <% =%> являются просто ярлыком для Response.Write. Если вы подумаете об этом, лямбда-выражение просто позволяет вам отложить выполнение кода Response.Write до соответствующего времени.

Итак, важной частью является вызов Response.Write для построения вашего списка, и когда пришло время внедрить пользовательский шаблон, я просто выполняю лямбда-код, который выполняет Response.Write для внедрения шаблона.

Вот пример кода, который поможет проиллюстрировать:

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>

Это ловкий трюк!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...