Вызовы функций ASP.NET MVC - PullRequest
       7

Вызовы функций ASP.NET MVC

0 голосов
/ 23 апреля 2009

У меня есть главная страница с функцией GetSiteMap(), эта функция используется для пользовательской визуализации карты сайта на основе текущего местоположения. Моя проблема в том, что в MVC у вас нет кода, лежащего в основе модели, таким образом, не раскрывая такую ​​функциональность.

Какой правильный способ сделать это? Должен ли я иметь какой-либо контроллер главной страницы с этой функцией, определенной в нем?

Public Function GetSitemap() As String
    Dim s As New SiteNavigation
    Dim siteMapNodeCollection As SiteMapNodeCollection

    If Not SiteMap.CurrentNode.Equals(SiteMap.RootNode) Then
      If Not SiteMap.CurrentNode.HasChildNodes Then
        ' otherwise it'll go to the pseudo-current directory, which is wrong
        Dim parentNode As SiteMapNode = SiteMap.CurrentNode.ParentNode.ParentNode
        s.AddBackLink(parentNode.Url, parentNode.Title)
      Else
        Dim parentNode As SiteMapNode = SiteMap.CurrentNode.ParentNode
        s.AddBackLink(parentNode.Url, parentNode.Title)
      End If
    End If

    If Not SiteMap.CurrentNode.HasChildNodes Then
      siteMapNodeCollection = SiteMap.CurrentNode.ParentNode.ChildNodes
    Else
      siteMapNodeCollection = SiteMap.CurrentNode.ChildNodes
    End If

    For Each siteMapNode As SiteMapNode In siteMapNodeCollection
      GenerateLinks(siteMapNode, s)
    Next

    Return s.GetSiteNavigation()
  End Function

  Private Sub GenerateLinks(ByRef siteMapNode As SiteMapNode, ByRef siteNavigation As SiteNavigation)
    If siteMapNode.Url.Length = 0 And siteMapNode.Description = "separator" Then
      siteNavigation.AddSeparator()
    ElseIf siteMapNode.Url.Length = 0 And siteMapNode.Description = "heading" Then
      siteNavigation.AddHeading(siteMapNode.Title)
    Else
      siteNavigation.AddLink(siteMapNode.Url, siteMapNode.Description, siteMapNode.Title, siteMapNode.HasChildNodes)
    End If
  End Sub

Извините, это я и имел ввиду. Я написал это очень быстро на днях, поэтому он не идеален, но сейчас он делает свою работу. Я использую карту сайта и не даю определенным элементам URL-адрес, а вместо этого использую описание, например «разделитель», чтобы указать, что элемент <li> отображается другим способом (к этому элементу HTML применяется другой класс).

Ответы [ 4 ]

1 голос
/ 23 апреля 2009

Поскольку карта сайта настраивается в зависимости от местоположения пользователя, я предполагаю, что вы говорите о создании элемента пользовательского интерфейса, а не отображении поисковой системы. Генерирование карты сайта для поисковых систем, вероятно, лучше всего делать в автономном режиме и просто периодически обновлять.

Чтобы сгенерировать пользовательский интерфейс, я бы подумал об использовании ViewUserControl и рендеринг его как частичного на любые нужные вам страницы. ViewUserControl значительно облегчит создание и поддержание связанной с ним разметки. Он также будет доступен для любого просмотра (и может быть включен в вашу MasterPage), который нуждается в нем. Как предполагает @Marc Gravell, данные для него могут быть созданы с помощью ActionFilter. Однако, возможно, было бы проще всего, если бы элемент управления был повсеместным, чтобы создать базовый контроллер, из которого ваши контроллеры могут получить и переопределить OnActionExecuted в базовом контроллере. Вы можете определить, когда был создан ViewResult, а затем создать и назначить ViewData данные для элемента управления картой сайта.

Базовый контроллер:

public override OnActionExecuted( ActionExecutedContext filterContext )
{
     if (filterContext != null && filterContext.Result is ViewResult)
     {
         ViewData["siteMap"] = this.GetSiteMap();
     }
}

MasterPage / View

<% Html.RenderPartial( "SiteMap", ViewData["siteMap"], ViewData ) %>

ViewUserControl

 foreach (var elem in Model)
 {
    .... render your HTML
 }
1 голос
/ 23 апреля 2009

Зависит от того, что он делает; если он просто проверяет запрос, то вы можете написать (например) метод расширения на HtmlHelper и записать его из представления;

<%=Html.GetSiteMap()%>

Другой альтернативой было бы вставить это в главную страницу. Если вам нужно выполнить запрос к базе данных и т. Д., Вы можете рассмотреть «фильтр действий», чтобы выполнить половину работы (подготовка данных), а затем (как указано выше) вызвать HtmlHelper в представлении для его отображения. Любое использование?

0 голосов
/ 23 апреля 2009

Моя проблема в том, что в MVC вы не иметь код модели, таким образом, не разоблачение такого рода функциональности

Это не правда. Код aspx + был реализацией по умолчанию до нескольких выпусков назад. В настоящее время шаблон по умолчанию не использует код, но встроен во время выполнения.

В MVC Контроллер должен создать модель вашей карты сайта, а представление (возможно, пользовательский контроль) несет единоличную ответственность за ее отображение.

Может быть, это может помочь http://mvcsitemap.codeplex.com/

0 голосов
/ 23 апреля 2009

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

<%= Html.Encode(ViewData.Model.GetSiteMap()) %>

, который будет отображать соответствующую карту сайта. Ваша модель может быть классом «Master Presentation», который предоставляет различные методы, которые обычно используются страницами.

Полагаю, это похоже на предложенное Марком решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...