更新: 更一般的问题是如何制作更高阶的观点组合?将委托传递给方法的方法相同。
原始问题: 我有一个页面视图和一个控件作为局部视图。从页面视图中,我使用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>
答案 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 Name
和object 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处理我上面的代码时,它会:
MvcForm
语句的开头运行BeginMyContainer
方法,编写自定义内容之前的任何HTML using
声明using
语句末尾的Dispose
上调用MvcForm
,编写自定义内容之前的任何HTML 答案 2 :(得分:0)
您需要为此创建控制器操作,但您可以使用@Html.Action("MyAction", "MyController", myModelObject)
并将任何参数从页面传递到myModelObject参数中的部分视图。它可能有点矫枉过正,但如果你的控件/局部视图需要做任何特殊的C#代码,那么这种方式效果很好。