Перемещение помощников MVC2 в движок просмотра бритвы MVC3 - PullRequest
3 голосов
/ 11 февраля 2011

На моем сайте MVC 2 у меня есть помощник html, который я использую для добавления javascripts для своих страниц. На моей главной странице у меня есть основные javascript-коды, которые я хочу включить, а затем на aspx-страницах я добавляю javascript-коды для конкретных страниц.

Так, например, мой Site.Master имеет что-то вроде этого:

....
<head>
    <%=html.renderScripts() %> 
</head>
...
//core scripts for main page
<%html.AddScript("/scripts/jquery.js") %>
<%html.AddScript("/scripts/myLib.js") %>
....

Затем на дочерней странице aspx я также могу включить другие сценарии.

...
//the page specific script I want to use
<% html.AddScript("/scripts/register.aspx.js") %>
...

Таким образом, когда вся страница рендерится, все файлы javascript собираются и отображаются в голове с помощью функции-заполнителя сайта RenderScripts. Это отлично работает.

Теперь с MVC 3 и механизмом просмотра бритвы они макетируют страницы по-разному, потому что теперь мои javascripts уровня страницы не отображаются / не включаются. Теперь все, что я вижу содержимое LayoutMaster.

Как получить решение для работы с MVC 3 и механизмом просмотра бритвы. (Помощник уже был переписан для возврата HTMLString ;-))

Для справки: мой MasterLayout выглядит так:

  ...
  ...
  <head>
  @{
      Html.AddJavaScript("/Scripts/jQuery.js");
      Html.AddJavaScript("/Scripts/myLib.js");
   }
   //Render scripts
   @html.RenderScripts()
  </head>
 ....

и дочерняя страница выглядит так:

@{
    Layout = "~/Views/Shared/MasterLayout.cshtml";
    ViewBag.Title = "Child Page";
    Html.AddJavaScript("/Scripts/register.aspx.js");
 }
 ....
 <div>some html </div>

Спасибо за вашу помощь.

Edit = Просто чтобы объяснить, если этот вопрос недостаточно ясен.

При создании «страницы» я собираю все файлы javascript, которые дизайнеры хотят использовать, используя html.addJavascript («filename.js») и сохраняю их в словаре - (1) останавливает людей, добавляющих дубликаты js-файлов - наконец, когда страница готова к визуализации, я аккуратно записываю все файлы javascript в заголовок. (2) - этот помощник помогает хранить JS в одном месте и не позволяет дизайнерам добавлять файлы javascript повсюду. Раньше это нормально работало с Master / SiteMaster Pages в mvc 2. но как мне этого добиться с помощью бритвы?

Редактировать: HTML-код помощника:

....
private const string SCRIPTLINK = 
        "<script src=\"{0}\" type=\"text/javascript\"></script>";

public static HtmlString RenderScripts(this HtmlHelper helper)  {

    OrderedDictionary scripts = 
        helper.ViewContext.HttpContext.Items["JavaScripts"] as OrderedDictionary;

    StringBuilder sb = new StringBuilder(500);
    foreach (DictionaryEntry script in scripts)  {
                sb.AppendFormat(SCRIPTLINK, script.Key);
        }
     return new HtmlString(sb.ToString());
 }
....

Ответы [ 3 ]

3 голосов
/ 11 февраля 2011

Трудно помочь вам с вашим текущим решением, не увидев код для ваших HtmlHelpers. Однако альтернативный (и довольно распространенный) подход будет использовать вместо этого разделы Razor.

На странице макета определите плашдол раздела, используя @RenderSection()

<head>
  <title>Page Title</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>
  @RenderSection("Scripts", required: false)
</head>

Тогда, на ваш взгляд, определите содержание вашего раздела

@section Scripts {
  <script src="myscript.js" type="text/javascript"></script>
}

Если вы хотите сэкономить время при наборе текста и сделать его еще чище, вы можете создать HtmlHelper для вывода тега скрипта

public static MVcHtmlString AddScript(this HtmlHelper helper, string path) {
  //create script element html here
}

и затем вы можете использовать синтаксический стиль, подобный вашему примеру

@section Scripts {
  @Html.AddScript("myscript.js")
}
2 голосов
/ 11 февраля 2011

Ваш код, вероятно, использует отдельные словари для страницы макета и представления.

Попробуйте сохранить словарь в ViewBag или HttpContext.Items.

1 голос
/ 14 февраля 2011

Спасибо за помощь и советы Слакс и Дэвид.Я наконец-то получил решение, которое, кажется, работает, но с некоторыми вещами, которые мне не нравятся.Если есть лучший способ, пожалуйста, не стесняйтесь указывать на это.

Вот моя дочерняя страница:

@{
    ViewBag.Title = "Child Page";
 }

 @section Scripts {

     @{Html.AddJavaScript("/Scripts/register.aspx.js");}

  }

 <div>some html </div>

Затем у меня есть _ViewStart.cshtml с:

@{
    this.Context.Items.Add("JavaScripts", 
        new System.Collections.Specialized.OrderedDictionary());

    Layout = "~/Views/Shared/MasterLayout.cshtml";
}

И мой MasterLayout выглядит так:1010 *

Это отображает теги моего скрипта в правильном порядке и месте, но требует от клиента вызова html помощника renderScripts на дочерних страницах.это нормально, так как мы можем создавать шаблоны, чтобы помочь с этим.Есть идеи получше?

...