从 MVC 中的 lambda 渲染 Html

发布于 2024-08-30 03:03:56 字数 536 浏览 1 评论 0原文

我有以下代码来生成列表,并允许开发人员根据需要自定义输出。

<% 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 的其余部分来说更加干净和标准。

I have the following code to generate a list and will allow developers to customize the output if needed.

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

This is not ideal, how can I allow the developers to add the html similar to other controls.

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

This way is much cleaner and standard with the rest of mvc.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

贪恋 2024-09-06 03:03:56

<%=%>标签只是 Response.Write 的快捷方式。如果您仔细想想,lambda 表达式只是允许您将 Response.Write 代码的执行推迟到适当的时间。

因此,重要的部分是调用 Response.Write 来构建列表,当需要注入自定义模板时,我只需执行 lambda,它会执行 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>");
    }
}

然后,要使用 Helper,请执行以下操作:

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

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

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

这是一个绝妙的技巧!

The <%=%> tags are simply a shortcut for Response.Write. If you think about it, the lambda expression is simply allowing you to defer execution of the Response.Write code until the appropriate time.

So, the important part is to call Response.Write to build your list, and when it’s time to inject the custom template, I just execute the lambda which does a Response.Write to inject the template.

Here is some example code to help illustrate:

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

Then, to use the Helper, do the following:

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

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

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

This is a neat trick!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文