如何在MVC3中的局部视图中渲染一个截面?

时间:2012-12-07 14:21:20

标签: asp.net-mvc asp.net-mvc-3 razor asp.net-mvc-partialview asp.net-mvc-views

在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>

然后,我在共享文件夹中有一个部分视图“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>
...

“Scripts”部分未在页面上呈现,输出HTML为

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    ...
    <script src="@Url.Content("~/Scripts/jquery-1.8.2.min.js")"></script>

  </body>
</html>

如何在局部视图中渲染剖面?

5 个答案:

答案 0 :(得分:46)

我在重复脚本之上遇到了同样的问题,因此我创建了几个Extension方法:

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()

您可能遇到的唯一问题是如果复杂化,脚本的呈现顺序。如果这成为一个问题,只需将脚本添加到视图/模板的底部,然后在呈现它们之前简单地颠倒扩展方法中的顺序。

答案 1 :(得分:6)

您无法在部分视图中使用部分。您可以按照here提到的自定义帮助程序。

答案 2 :(得分:2)

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

使用帮手

如果您可以升级到MVC4,则可以使用新的捆绑和缩小功能:http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification。它专门用于解决您要实现的目标(包括脚本)。

或者,您可以将http://combres.codeplex.com/与MVC3

一起使用

答案 3 :(得分:0)

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

  • Layout.cshtml
  • 查看 - X.
    • PartialView Y(在View-X内部调用)

然后你需要定义

View-X NOT PartialView Y 中的

@section Script{ .... },因为 View-X 设置了View.LayoutLayout.cshtml

答案 4 :(得分:-1)

所有这些都是很好的信息,但是如果你查看他的原始代码,则部分是大写的,因此不被识别。

它应该是@section blahblah而不是@Section