【发布时间】:2016-04-03 16:41:55
【问题描述】:
我有一个触发模式的按钮元素。这段代码是可重用的,并且需要出现在许多不同的视图中。
<button class="btn btn-default" type="button" data-toggle="modal" data-target="#modalAcctToggle">
Toggle Accounts
</button>
<div id="modalAcctToggle" tabindex="-1" class="modal fade">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span>×</span></button>
<h4 class="modal-title">Available Accounts</h4>
</div>
<div class="modal-body">
[contents not relevant]
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
非常简单明了。将所有内容放在局部视图中,并根据需要使用 @Html.Partial("_accountToggler") 进行渲染
但是,Bootstrap 文档鼓励将模态框放在页面之外:
http://getbootstrap.com/javascript/#modals
模态标记放置 始终尝试将模态的 HTML 代码放置在文档的顶级位置以避免其他组件 影响模态框的外观和/或功能。
我的直接想法是为此使用 Razor 部分。
<button data-target="#modalAcctToggle" etc... />
@section modals {
<div id="modalAcctToggle" etc... />
}
将所有模态框包装在一个部分中,然后在 Layout 中使用 @RenderSection("modals"),模态框将在 DOM 中的安全位置发出。
很遗憾,Razor 部分在局部视图中不起作用!这显然是设计使然,但它旨在限制在部分中使用脚本。
我从试图解决部分中缺少部分的人们那里发现了许多其他问题,但他们专注于处理脚本。在那里找到的解决方案基本上包括滚动您自己的等效于 Razor 部分,或者专门用于处理脚本(如捆绑)。当我的使用不是所述限制的目标时,必须努力重新发明 Razor 部分以绕过故意限制,这似乎很可笑。
我怎样才能最好地处理将模态 HTML 放到不同的位置?
更新:正如 cmets 关于答案所讨论的,这个问题基于两个基本的误解。
1) Bootstrap modal 可以毫无问题地位于 HTML 的其余部分中。你只需要小心防止它继承任何不应该继承的 CSS。
2) 部分不是累积的。因此,即使我可以在局部视图中使用部分,它也不会按照我想要的方式工作。使用同一部分的多个部分会相互覆盖。这可能是根据设计,部分不能以局部形式工作的真正原因。
【问题讨论】:
标签: asp.net-mvc twitter-bootstrap-3 asp.net-mvc-partialview