wake-up-neo.net

Wie wird ein Abschnitt in einer Teilansicht in MVC3 gerendert?

In einem MVC3-Projekt habe ich eine "_Layout.vbhtml" -Datei mit diesem Code

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

Dann habe ich eine Teilansicht "ValidationScripts.vbhtml" im freigegebenen Ordner mit

@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

Wenn ich die Teilansicht aus einer Ansicht wie dieser anrufe ... 

@ModelType MvcExample.MyModel
@Code
    ViewData("Title") = "Test"
End Code

@Html.Partial("ValidationScripts")

<h2>Just a Test</h2>
...

der Abschnitt "Scripts" wird nicht auf der Seite gerendert und der Ausgabe-HTML-Code wird angezeigt 

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

  </body>
</html>

Wie kann ich den Abschnitt in der Teilansicht rendern?

25
Max

Ich hatte das gleiche Problem zusätzlich zu doppelten Skripten, also erstellte ich ein paar Erweiterungsmethoden:

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

In jeder Ansicht oder Teilansicht oder Vorlage zum Anzeigen/Bearbeiten fügen Sie einfach das hinzu, was Sie benötigen:

@{
  Html.AddJavaScript("http://cdn.jquerytools.org/1.2.7/full/jquery.tools.min.js");
}

In Ihren Layouts rendern Sie es, wo Sie es möchten:

<!DOCTYPE html>
<html lang="en">
  <head>
  @Html.RenderStyles()
  @Html.RenderJavascripts()

Das einzige Problem, das Sie möglicherweise haben, ist die Reihenfolge, in der die Skripts gerendert werden, wenn Sie zu komplex werden. Wenn dies zu einem Problem wird, fügen Sie die Skripts einfach am Ende Ihrer Ansichten/Vorlagen hinzu und kehren Sie die Reihenfolge in der Erweiterungsmethode um, bevor Sie sie rendern.

46
Erik Philips

Sie können Abschnitte nicht in Teilansichten verwenden. Sie können für benutzerdefinierte Helfer wie angegeben hier gehen.

6
VJAI

Ich denke, Sie sollten Helfer dafür einsetzen http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor .aspx

Wenn Sie ein Upgrade auf MVC4 durchführen können, können Sie die neue Bündel- und Minifizierungsfunktion verwenden: http://www.asp.net/mvc/tutorials/mvc-4/bundling-and-minification . Es ist speziell darauf ausgerichtet, das zu erreichen, was Sie erreichen möchten (einschließlich Skripts). 

Alternativ können Sie http://combres.codeplex.com/ mit MVC3 verwenden

2
Zar Shardan

Wenn ich es richtig verstanden habe, haben Sie eine Struktur

  • Layout.cshtml
  • Ansicht - X
    • PartialView Y (in View-X aufgerufen)

dann müssen Sie das definieren 

@section Script{ .... } in View-X und NICHT PartialView Y seit View-X hat View.Layout auf Layout.cshtml gesetzt

0