我在 _Layout.cshtml
中定义了此部分
@RenderSection("Scripts", false)
我可以从视图中轻松使用它:
@section Scripts {
@*Stuff comes here*@
}
我正在努力的是如何从局部视图中获取本节内注入的一些内容 .
我们假设这是我的视图页面:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
我需要从 _myPartial
部分视图中的 Scripts
部分中注入一些内容 .
我怎样才能做到这一点?
22 回答
假设您有一个名为_contact.cshtml的部分视图,您的联系人可以是合法(名称)或物理主题(名字,姓氏) . 您的视图应该关注渲染的内容以及可以使用javascript实现的内容 . 因此可能需要延迟渲染和JS内部视图 .
我认为,如何将其省略的唯一方法就是我们创建一种处理此类UI问题的不引人注目的方式 .
还要注意MVC 6会有一个所谓的View Component,甚至MVC期货都有类似的东西,Telerik也支持这样的东西......
好吧,我猜其他海报为你提供了一种方法,可以直接在你的部分中包含一个@section(通过使用第三方html助手) .
但是,我认为,如果你的脚本与你的部分内容完全耦合,那么你可以完成它(如果你打算在一个视图中多次使用部分,请注意脚本重复);
部分按设计要求.369339_ s您可以使用some custom helpers来实现类似的行为,但老实说,_368341负责包含必要的脚本,而不是部分责任 . 我建议使用主视图的@scripts部分来做到这一点,而不要让部分人担心脚本 .
您可以选择使用Folder / index.cshtml作为母版页,然后添加部分脚本 . 然后,在您的布局中,您有:
和你的index.cshtml:
它会影响你所有的偏见 . 它对我有用
我解决了这个完全不同的路线(因为我很匆忙而且不想实现新的HtmlHelper):
我将Partial View包装在一个很大的if-else语句中:
然后,我使用自定义ViewData两次调用Partial:
我有一个类似的问题,我有一个母版页如下:
但部分视图取决于“脚本”部分中的一些JavaScript . 我通过将部分视图编码为JSON,将其加载到JavaScript变量然后使用它来填充div来解决它,所以:
您不需要在局部视图中使用部分 .
包含在您的部分视图中 . 它在jQuery加载后执行该函数 . 您可以为代码更改de condition子句 .
胡里奥斯派德
从this thread中的解决方案中,我提出了以下可能过于复杂的解决方案,它允许您在使用块中延迟渲染任何html(脚本) .
用法
创建“部分”
when-i-call-you
特异性地呈现它:渲染“部分”
(即在父视图中显示延迟的部分)
代码
我有类似的问题解决了这个问题:
这是一个很好的方式来注入我的猜测 .
如果你确实需要从
partial
运行一些js
,那么你可以这样做,jQuery
是必需的:You can use these Extension Methods :(另存为PartialWithScript.cs)
Use like this:
示例partial:(_ MyPartial.cshtml)将html放在if中,将js放在else中 .
在您的_Layout.cshtml中,或者您希望渲染部分脚本的地方,请添加以下内容(一次):它将仅呈现此位置当前页面上所有部分的javascript .
然后使用你的部分,只需执行此操作:它将仅渲染此位置的html .
使用Mvc Core,您可以创建一个整洁的TagHelper
scripts
,如下所示 . 这很容易变成一个section
标签,你也可以给它起一个名字(或者名字取自派生类型) . 请注意,需要为IHttpContextAccessor
设置依赖项注入 .When adding scripts (e.g. in a partial)
When outputting the scripts (e.g. in a layout file)
Code
我刚刚在我的局部视图中添加了这个代码并解决了问题,虽然不是很干净,但它确实有效 . 您必须确保要渲染的对象的ID .
$(document).ready(function(){$("#Profile_ProfileID").selectmenu({icons:{button:'ui-icon-circle-arrow-s'}}); $("#TitleID_FK").selectmenu({icons:{button:'ui-icon-circle-arrow-s'}}); $("#CityID_FK" ).selectmenu({icons:{button:'ui-icon-circle-arrow-s'}});$("#GenderID_FK").selectmenu({icons:{button:'ui-icon-circle-arrow-s'}}); $("#PackageID_FK").selectmenu({icons:{button:'ui-icon-circle-arrow-s'}}); });
冥王星的想法以更好的方式:
CustomWebViewPage.cs:
查看\ web.config中:
视图:
部分(_BackendSearchForm.cshtml):
布局页面:
我遇到了这个问题并使用了this技术 .
它是我发现的最好的解决方案,非常灵活 .
另外 please vote here添加对累积部分声明的支持
我能想到的第一个解决方案是使用ViewBag来存储必须呈现的值 .
我从未尝试过如果从局部视角开展这项工作,但它应该是imo .
这对我有用,允许我在同一个文件中共同定位javascript和html以进行局部视图 . 帮助思考过程在同一局部视图文件中查看html和相关部分 .
在View中使用名为“_MyPartialView.cshtml”的部分视图
在部分视图文件中
OP的目标是他希望将内联脚本定义到他的部分视图中,我假设此脚本仅特定于该部分视图,并将该块包含在他的脚本部分中 .
我知道他希望将Partial View自包含 . 这个想法类似于使用Angular时的组件 .
我的方法是将脚本保持在部分视图中 . 现在的问题是,当调用Partial View时,它可能会在所有其他脚本(通常添加到布局页面的底部)之前在那里执行脚本 . 在这种情况下,您只需要部分视图脚本等待其他脚本 . 有几种方法可以做到这一点 . 我之前使用的最简单的一个是在
body
上使用一个事件 .在我的布局上,我会在底部有这样的东西:
然后在我的部分视图(在底部):
另一种解决方案是使用堆栈来推送所有脚本,并在最后调用每个脚本 . 如前所述,其他解决方案是RequireJS / AMD模式,它也非常有效 .
有一种方法可以在局部视图中插入部分,但它并不漂亮 . 您需要从父视图访问两个变量 . 由于部分视图的一部分目的是创建该部分,因此需要这些变量是有意义的 .
以下是在局部视图中插入一个部分的样子:
并在插入局部视图的页面中...
您还可以使用此技术在任何类中以编程方式定义节的内容 .
请享用!
这是一个非常受欢迎的问题,所以我会发布我的解决方案 .
我有同样的问题,虽然它不是部分依赖于视图 .
我的情况是,一个动作本身可以访问,但也可以嵌入一个视图 - 谷歌 Map .
在我
_layout
我有:在我的
index
视图中,我有:在我的
clients
视图中,我有(所有 Map 和assoc .html):我的
Clients_Scripts
视图包含要在页面上呈现的javascript这样我的脚本就被隔离了,并且可以在需要的地方呈现到页面中,而
body_scripts
标记只在剃刀视图引擎找到它的第一次出现时呈现 .这让我把所有东西都分开了 - 这是一个对我很有效的解决方案,其他人可能会遇到问题,但它确实修补了“按设计”的漏洞 .
遵循unobtrusive原则,"_myPartial"并不十分需要将内容直接注入脚本部分 . 您可以将这些部分视图脚本添加到单独的
.js
文件中,并从父视图将它们引用到@scripts部分 .我们对Web的思考方式存在根本性缺陷,尤其是在使用MVC时 . 缺点是JavaScript在某种程度上是视图的责任 . 视图是一种视图,JavaScript(行为或其他)是JavaScript . 在Silverlight和WPF的MVVM模式中,我们面对的是“先查看”或“先模型” . 在MVC中,我们应该总是尝试从模型的角度来推理,JavaScript在很多方面都是这个模型的一部分 .
我建议使用AMD模式(我自己喜欢RequireJS) . 在模块中分离JavaScript,定义您的功能并从JavaScript挂钩到html,而不是依赖于视图来加载JavaScript . 这将清理您的代码,分离您的顾虑,一举使生活更轻松 .