ASP.Net MVC中的多个ITemplate占位符等效

时间:2012-10-04 17:57:32

标签: asp.net asp.net-mvc razor html-helper

我是ASP.Net MVC的新手,并且一直使用Web Forms。我找到了Replacement for ITemplate in MVC?,它给出了一个创建一个名为BeginBlock的HTML助手的例子,它包装了标题&内容来自:

@using (Html.BeginBlock("MY TITLE")) {
       MY CONTENT GOES HERE
}

<div>
  <div><h1>MY TITLE</h1></div>
</div>
MY CONTENT GOES HERE

我有一个场景,在Web窗体中,我们曾经使用多个ITemplates来定义用户控件中的容器,然后我们将其包装在HTML中,例如,在Web窗体中,我们可以创建一个名为Panel的用户控件并拥有两个ITemplate属性,一个名为Content,另一个名为ContentNonScrollable。然后,我们将使用以下标记来使用用户控件:

<MySite:Panel>
    <Content>
        Content 1 Goes Here
    </Content>
    <ContentNonScrollable>
        Content 2 goes here
    </ContentNonScrollable>
</MySite:Panel>

然后,用户控件将输出以下内容,HTML:

<div class="my-panel">
    <div class="my-panel-content">
        Content 1 Goes Here
    </div>
    <div class="my-scrollable-panel-content">
        Content 2 Goes Here
    </div>
</div>

在MVC中有没有办法,通过HTML Helpers(或其他任何东西),我们可以通过.cshtml模板文件中的标记来设计与上述Web Forms示例等效的东西?

例如类似的东西(显然,下面没有正确的语法,只是为了解释我们的想法):

@using (Html.BeginPanel() {
       {
            Content 1 Goes Here
       }
       {
            Content 2 Goes Here
       }
}

3 个答案:

答案 0 :(得分:1)

您可以使用此部分。截面是为布局(即母版页)设计的,但您可以嵌套母版页以创建剖面区域。

但是,听起来你想把它作为某种类型的控制。另一种选择可能是Templated Razor Delegates

另一个选项是编辑器/显示模板,尽管这通常不是标记。您可以使用变量来传递内容。

另一种选择是使用部分视图,并使用ViewData传递上下文部分。

实际上有很多不同的方法可以解决这个问题,您选择哪种方式取决于您的需求。你能解释具体情况吗?

答案 1 :(得分:0)

我不明白为什么不。我自己没有尝试过,但由于你可以在.cshtml页面中混合使用标记和脚本,你应该可以做类似的事情

@using (Html.BeginPanel()) { 
  @using(Html.BeginScrollableContent()) {
     Content 1 goes here
  }
  @using (Html.BeginNonScrollableContent()) {
     Content 2 goes here
  }
}

我查看了你引用的帖子(一个好的,BTW),你应该能够在实现过程中遵循这个例子。

答案 2 :(得分:0)

感谢@mystere引导我走向模板化代表和部分视图,这些视图采用带有接受字符串和html标记的变量的模型,我找到了以下解决方法,这与我在上面的场景中的想法相当

创建名为_PanelPartial.cshtml的部分视图,并将模型设置为_PanelPartialModel类型,其中包含以下属性:

public class _PanelPartialModel
{
    public Func<dynamic, HelperResult> Content { get; set; }
    public Func<dynamic, HelperResult> NonScrollableContent { get; set; }
}

_PanelPartial.cshtml中,您可以使用以下内容:

@model _PanelPartialModel
<div class="my-testing-panel">
    <p>hello this is heading text</p>
    <div class="my-testing-panel-content">
        @Model.Content(null)
    </div>
    <p>And this is something in between madafuker!</p>
    <div class="my-testing-panel-scrollable-content">
        @Model.NonScrollableContent(null)
    </div>
    <p>and what about another footer!</p>
</div>

@ Model.Content(null)和@ Model.NonScrollableContent(null)是模型中委托变量的调用。这些服务器作为占位符。

然后,只要您需要使用此面板,就可以使用以下内容:

@Html.Partial("_PanelPartial", new _PanelPartialModel() {
    Content = @<text>
                <div>This is the scrollable content</div>
          </text>, 
    NonScrollableContent = @<text>
                            <h2>This is non scrollable content</h2>
                       </text>
});

这将最终生成以下HTML标记:

<div class="my-testing-panel">
    <p>hello this is heading text</p>
        <div class="my-testing-panel-content">
            <div>This is the scrollable content</div>
        </div>
    <p>And this is something in between madafuker!</p>
        <div class="my-testing-panel-scrollable-content">
            <h2>This is non scrollable content</h2>
        </div>
    <p>and what about another footer!</p>
</div>