如何在MVC3的部分视图中呈现一个部分?
在MVC3项目中,我有一个“_Layout.vbhtml”文件与此代码
<!DOCTYPE html> <html> <head> </head> <body> ... <script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")"></script> @RenderSection("Scripts", false) </body> </html>
然后,我在Shared文件夹中使用了部分视图“ValidationScripts.vbhtml”
@Section Scripts <script src="@Url.Content("~/Scripts/jquery.validate.min.js")"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")"></script> <script src="@Url.Content("~/Scripts/jquery.validate.fix.js")"></script> <script src="@Url.Content("~/Scripts/localization/messages_de.js")"></script> End Section
如果我从这样的视图调用部分视图…
@ModelType MvcExample.MyModel @Code ViewData("Title") = "Test" End Code @Html.Partial("ValidationScripts") <h2>Just a Test</h2> ...
“脚本”部分不在页面上呈现,并且输出的HTML是
<!DOCTYPE html> <html> <head> </head> <body> ... <script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")"></script> </body> </html>
我如何渲染部分视图中的部分?
我在重复的脚本之上有同样的问题,所以我创build了几个扩展方法:
public static class HtmlHelperExtensions { private const string _jSViewDataName = "RenderJavaScript"; private const string _styleViewDataName = "RenderStyle"; public static void AddJavaScript(this HtmlHelper htmlHelper, string scriptURL) { List<string> scriptList = htmlHelper.ViewContext.HttpContext .Items[HtmlHelperExtensions._jSViewDataName] as List<string>; if (scriptList != null) { if (!scriptList.Contains(scriptURL)) { scriptList.Add(scriptURL); } } else { scriptList = new List<string>(); scriptList.Add(scriptURL); htmlHelper.ViewContext.HttpContext .Items.Add(HtmlHelperExtensions._jSViewDataName, scriptList); } } public static MvcHtmlString RenderJavaScripts(this HtmlHelper HtmlHelper) { StringBuilder result = new StringBuilder(); List<string> scriptList = HtmlHelper.ViewContext.HttpContext .Items[HtmlHelperExtensions._jSViewDataName] as List<string>; if (scriptList != null) { foreach (string script in scriptList) { result.AppendLine(string.Format( "<script type=\"text/javascript\" src=\"{0}\"></script>", script)); } } return MvcHtmlString.Create(result.ToString()); } public static void AddStyle(this HtmlHelper htmlHelper, string styleURL) { List<string> styleList = htmlHelper.ViewContext.HttpContext .Items[HtmlHelperExtensions._styleViewDataName] as List<string>; if (styleList != null) { if (!styleList.Contains(styleURL)) { styleList.Add(styleURL); } } else { styleList = new List<string>(); styleList.Add(styleURL); htmlHelper.ViewContext.HttpContext .Items.Add(HtmlHelperExtensions._styleViewDataName, styleList); } } public static MvcHtmlString RenderStyles(this HtmlHelper htmlHelper) { StringBuilder result = new StringBuilder(); List<string> styleList = htmlHelper.ViewContext.HttpContext .Items[HtmlHelperExtensions._styleViewDataName] as List<string>; if (styleList != null) { foreach (string script in styleList) { result.AppendLine(string.Format( "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />", script)); } } return MvcHtmlString.Create(result.ToString()); } }
在任何视图或部分视图或显示/编辑模板,你只需添加你所需要的:
@{ Html.AddJavaScript("http://cdn.jquerytools.org/1.2.7/full/jquery.tools.min.js"); }
在您的布局中,您可以将其渲染到您想要的位置:
<!DOCTYPE html> <html lang="en"> <head> @Html.RenderStyles() @Html.RenderJavascripts()
您可能遇到的唯一问题是,如果复杂,则会显示脚本的顺序。 如果这成为一个问题,只需将脚本添加到视图/模板的底部,并在渲染之前简单地颠倒扩展方法中的顺序即可。
您不能在部分视图中使用部分。 你可以去这里提到的定制助手。
如果你可以升级到MVC4,你可以使用新的捆绑和缩小function: http : //www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification 。 它是专门devise来解决你想要实现的(包括脚本)。
如果我理解正确,你有一个结构
- Layout.cshtml
- 查看 – X
- 部分视图Y(在View-X中调用)
那么你需要定义的
由于View-X将其View.Layout
设置为Layout.cshtml
,因此View-X中的@section Script{ .... }
和NOT PartialView Y
所有这些都是很好的信息,但是如果你看看他的原始代码,Section是大写,因此不被认可。
它应该是@section
blahblah不@section