2

我是 ASP.Net MVC 的新手,直到现在一直在使用 Web 表单。我在 MVC 中找到了 ITemplate 的替代品?它给出了一个创建名为 BeginBlock 的 HTML 帮助程序的示例,该帮助程序包含来自以下位置的标题和内容:

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

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

我有一个场景,在 Web 窗体中,我们曾经使用多个 ITemplate 来定义用户控件中的容器,然后我们将这些容器包装在 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 表单示例等效的东西?

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

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

3 回答 3

1

您可以为此使用部分。部分专为布局(即母版页)而设计,但您可以嵌套母版页以创建分段区域。

但是,听起来您想将其作为某种类型的控件来执行。另一个选项可能是Templated Razor Delegates

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

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

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

于 2012-10-04T20:04:59.093 回答
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>
于 2012-10-05T14:28:35.817 回答
0

我不明白为什么不。我自己没有尝试过,但是由于您可以在 .cshtml 页面中混合标记和脚本,因此您应该能够执行类似的操作

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

我查看了您引用的帖子(一个很好的,顺便说一句),就实施而言,您应该能够遵循该示例。

于 2012-10-04T19:55:49.317 回答