如何将模板注入ASP.NET MVC中的视图?

时间:2013-09-18 20:26:41

标签: asp.net-mvc

更新: 更一般的问题是如何制作更高阶的观点组合?将委托传递给方法的方法相同。

原始问题: 我有一个页面视图和一个控件作为局部视图。从页面视图中,我使用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>

3 个答案:

答案 0 :(得分:1)

将新属性添加到partial的viewmodel:“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>

或者您可以添加字符串属性“Template”并执行

<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()。

答案 1 :(得分:0)

制作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的{​​{1}}方法中编写任何HTML来自您的自定义内容。

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

  1. MvcForm语句的开头运行BeginMyContainer方法,编写自定义内容之前的任何HTML
  2. using声明
  3. 中写下HTML自定义内容
  4. using语句末尾的Dispose上调用MvcForm,编写自定义内容之前的任何HTML
  5. 相关:rolling my own @Html.BeginfBrm()

答案 2 :(得分:0)

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