0

更新:更普遍的问题是什么是高阶视图组合的方法?与将委托传递给方法的方式相同。

原始问题:我有一个页面视图和一个控件作为部分视图。从页面视图中,我使用 Html.Partal("MyControl", myControlModel) 呈现控件。现在这个控件有一些我希望可以从页面视图中自定义的区域。因此,如果控件从不同的页面呈现,这些区域将填充不同的内容。基本上,我正在寻找一种将页面视图中的一段 HTML 注入部分视图的方法。我可以在 MVC 中做到这一点吗?如果是这样,怎么做?

例子:

页面预览:

<div class="page">
@Html.Partial("MyControl", myControlModel, @<text>My <b>custom</b> piece of HTML which is different for each page<text>)
</div>

我的控制视图:

<div class="my-control">
<div class="common-part-for-all-pages">
   @Model.Value
</div>
<div class="part-that-has-to-be-customized">
   @* there must be a piece of HTML provided somehow from the page view *@
</div>
</div>

预期结果:

<div class="page>
    <div class="my-control">
    <div class="common-part-for-all-pages">
       @Model.Value
    </div>
    <div class="part-that-has-to-be-customized">
       My <b>custom</b> piece of HTML which is different for each page
    </div>
    </div>
</div>
4

3 回答 3

1

向局部视图模型添加新属性:“TemplateName”和“TemplateModel”。然后做

<div class="my-control">
<div class="common-part-for-all-pages">
   @Model.Value
</div>
<div class="part that has to be customized">
   @Html.Partial(Model.TemplateName, Model.TemplateModel)
</div>
</div>

或者您可以添加一个字符串属性“模板”并执行

<div class="my-control">
<div class="common-part-for-all-pages">
   @Model.Value
</div>
<div class="part that has to be customized">
   @Html.Raw(Model.Template)
</div>
</div>

像这样称呼它

@{
    // just set the property
    myControlModel.Template = "some html";
    myControlModel.Template = Html.TextBox(/*...*/).ToString();
    myControlModel.Template = Template("hello").ToString();
}
@Html.Partial("MyControl", myControlModel)
@helper Template(string text)
{
    <span>@text</span>
}

如果使用 MvcHtmlString 类型,则不需要 ToString()。

于 2013-09-18T20:50:11.753 回答
0

您需要为此创建控制器操作,但您可以使用@Html.Action("MyAction", "MyController", myModelObject)页面中的任何参数并将其传递到 myModelObject 参数中的部分视图。这可能有点矫枉过正,但如果您的控制/局部视图需要执行任何特殊的 C# 代码,那么这种方式效果很好。

于 2013-09-18T20:47:03.707 回答
0

制作 a class PartialModel,给它两个属性string Nameobject Model,然后@Html.Partial(pm.Name, pm.Model)在你的局部视图中使用。

如果你想每次都在里面放不同的 HTML,上面的方法是行不通的,所以请继续阅读。


您可以使用类似于Html.BeginForm

@using (Html.BeginMyContainer())
{
    <h3>Hi!</h3>
    <p>This is some custom content.</p>
}

(这将是类的BeginMyContainer扩展方法HtmlHelper。)

您的Html.BeginMyContainer方法应该返回一个继承自 的类MvcForm,即IDisposable. 在BeginMyContainer方法中,您将在容器的自定义内容之前编写任何 HTML,Dispose在返回的方法中,MvcForm您将在自定义内容之后编写任何 HTML。

当 Razor 处理我上面的代码时,它将:

  1. BeginMyContainer在语句开头运行该方法,using在自定义内容之前编写任何 HTML
  2. using在语句中写入 HTML 自定义内容
  3. 在语句末尾调用Dispose,在自定义内容之前编写任何 HTMLMvcFormusing

相关:滚动我自己的@Html.BeginfBrm()

于 2013-09-18T20:38:16.527 回答