4

我仍然对 MVC 感到困惑,并且在一个使用大量“图块”(你知道,通常的“带有标准化标题和一些内容的矩形部分”模式)用于视觉显示的网站上工作。没有什么花哨的,只是一种将内容放入框中以便于布局和导航的方法。目前,“瓷砖”(我的术语)是这样构建的:

<div class="tile">
    <div class="tile-header">
        <h2>Title</h2>
    </div>
    <div class="tile-body">
        (arbitrary content)
    </div>
</div>

注意:“任意内容”是指任何内容,无论是静态的还是动态的,所以不一定是我可以插入变量并传递给助手的东西,我需要更多的灵活性。

我的问题是,用于封装此模式并使从代码调用更容易/更具表现力的最佳方法是什么?我知道部分视图,但我如何将任意正文内容传递给部分视图?(这可能只是我对 MVC 展示的有限了解)

我尝试像这样构建 Razor 助手:

@Tile.Begin("Title")
    (arbitrary content)
@Tile.End()

但是 Razor 窒息,因为我不能包含“tile-body”关闭 div。(如果我这样做了,那么我必须将正文内容作为字符串变量传递,这并不总是可行的)

我可以看到这样的东西:

@using (Tile.Begin("Title")) {
    (arbitrary content)
}

这对我来说似乎是最优雅的,虽然不像 @Tile.Begin() 和 @Tile.End() 调用那么容易扫描。据我了解,我必须创建一个类并实现 IDisposable,但是当我尝试从帮助类返回一串原始 HTML 标记时,它只是将编码的标记语法写入屏幕,所以我假设我会遇到同样的问题在这里?

感谢您的任何建议。:)

4

1 回答 1

1

好吧,我建议使用 Display/EditorTemplates 来生成动态图块。您甚至可以将它们与 html 助手(而不是 razor 助手)结合使用。

您对自定义 html 帮助程序的问题是您没有正确执行它。您必须使用 HtmlHelper 对象。正确的方法是这样的:

public static class TileExtension {

    public static TileHelper Tile(this HtmlHelper helper, string title) {
        helper.ViewContext.Writer.Write(
            "<div class=\"tile\"><div class=\"tile-header\"><h2>" + title + "</h2></div>"
            + "<div class=\"tile-body\">"
        );
        return new TileHelper(helper);
    }

    private class TileHelper : IDisposable {
        private HtmlHelper _helper;
        public TileHelper(HtmlHelper helper) { _helper = helper; }
        public void Dispose() {
           _helper.ViewContext.Writer.Write("</div></div>");
        }
    }
}

然后你会像这样使用它@using(Html.Tile("Title")) { // your content }

确保密切关注静态关键字,以及this参数中关键字的使用。这些是使扩展工作所必需的。

此外,您应该将创建此类的命名空间添加到 web.config 的 pages/namespaces 元素中:

<pages>
    <namespaces>
        <add namespace="My.Name.Space" />
    </namespaces>
<pages>
于 2012-10-23T20:49:52.660 回答