如何在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() 

您可能遇到的唯一问题是,如果复杂,则会显示脚本的顺序。 如果这成为一个问题,只需将脚本添加到视图/模板的底部,并在渲染之前简单地颠倒扩展方法中的顺序即可。

您不能在部分视图中使用部分。 你可以去这里提到的定制助手。

我想你应该使用助手这个http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

如果你可以升级到MVC4,你可以使用新的捆绑和缩小function: http : //www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification 。 它是专门devise来解决你想要实现的(包括脚本)。

或者,您可以使用http://combres.codeplex.com/和MVC3

如果我理解正确,你有一个结构

  • Layout.cshtml
  • 查看 – X
    • 部分视图Y(在View-X中调用)

那么你需要定义的

由于View-X将其View.Layout设置为Layout.cshtml ,因此View-X中的@section Script{ .... }NOT PartialView Y

所有这些都是很好的信息,但是如果你看看他的原始代码,Section是大写,因此不被认可。

它应该是@section blahblah不@section