Создание класса помощника по веб-навигации для MVC - PullRequest
2 голосов
/ 12 ноября 2009

Я новичок в MVC и пытаюсь использовать класс веб-навигатора в моем приложении MVC.http://polymorphicpodcast.com/shows/webnavigator/ Этот класс позволяет нам иметь строго типизированные URL в файле центрального класса.

У меня есть 3 вопроса:

  1. Это лучший способ хранения строго типизированных URL в MVC или
    MVC имеет некоторые специальные вспомогательные методы, которые делают то же самоевещь.

  2. Какое лучшее место для файла класса, например VIEW / MODEL или
    CONTROLLER

  3. Ниже приведен примеркласс Navigation, который возвращает правильный URL для файла изображения.Вместо передачи объекта UrlHelper в I я хочу запустить этот класс в контексте System.Web.Mvc.ViewPage (текущий контекст).Каков наилучший способ сделать это.

Пример класса навигатора для изображений:

using System.Web;
using System.Web.Mvc;

public class IMG
{
    public string AjaxLoading(UrlHelper urlHelper)
    {
        return urlHelper.Content("~/Images/loading2.gif");
    }
}

1 Ответ

3 голосов
/ 12 ноября 2009

Чтобы ответить на ваши вопросы:

  1. Существует множество способов создания навигационных ссылок для ASP.NET MVC, и то, что работает для вас, является лучшим.

  2. Большинство ответили бы, что файлы классов должны быть помещены в папку Model. Мне показалось более целесообразным поместить классы ViewModel в отдельную папку, а классы, используемые в приложении (бизнес-логика / сущность приложения), в отдельный файл.

  3. То, что вы пытаетесь выполнить, похоже на работу для методов расширения. Вот хороший учебник: http://www.dotnetcurry.com/ShowArticle.aspx?ID=406&AspxAutoDetectCookieSupport=1

То, что вы делаете, находится на правильном пути, однако вам нужно создать статические классы и статические функции / методы для правильной работы.

http://msdn.microsoft.com/en-us/library/bb383977.aspx содержит общую информацию о методах расширения.

Одно быстрое примечание: чтобы разрешить использование всех созданных вами методов расширения, вам нужно сослаться на класс / пространство имен, в которое вы их поместили.

Есть два способа сделать это:

  1. Предполагая, что вы разместили методы расширения в MvcApplication1.MyExtensionMethods, добавьте следующее после

      <page>
          <namespaces> 
    

    тег в файле web.config вашего приложения (не в файле web.config представления)

         <add namespace="MvcApplication1.MyExtensionMethods"/>
    

    Это позволит использовать методы расширения во всех ваших файлах представлений (.aspx / .ascx).

  2. Place

      <%@ Import Namespace="MvcApplication1.MyExtensionMethods" %>
    

    вверху ваших файлов .aspx / .ascx. Это необходимо сделать для каждого файла, для которого необходимо использовать методы расширения (не эффективно)

Вот то, что я реализую, и до сих пор оно мне хорошо помогло.

NavigationLink.cs

   public class NavigationLink
   {
        string Text {get; set;}
        RouteValueDictionary Routes {get; set;}
        string RouteName {get; set;}
   }

NavigationLink.ascx (Поместите в общую папку для быстрого доступа ко всему приложению)

(Примечание. Я обертываю ссылки в теги

, потому что я использую списки для всех своих элементов управления навигацией. Затем вы можете поместить эти ссылки в любой тип списка, предоставляя свободу в отношении класса / стиля списка. )
   <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<NavigationLink>>">

   <% foreach(NavigationLink n in Model){ %>
      <li>
          <a href="<%= string.IsNullOrEmpty(n.RouteName) ? Url.RouteUrl(Routes) : Url.RouteUrl(RouteName) %>">
         <%= n.Text %>
        </a>
      </li>
   <% } %>

Menus.cs (некоторые примеры)

  public static Menus
  {
       public static List<NavigationLink> MainMenu()
       {
           List<NavigationLink> links = new List<NavigationLink>();
           links.Add(new NavigationLink{
              Text = "Home",
              Routes = new RouteValueDictionary(new { action="Index", controller="Home" })
           });
           return links;
       }

       public static List<NavigationLink> UserMenu()
       {
           List<NavigationLink> links = new List<NavigationLink>();
           links.Add(new NavigationLink{
              Text = "Messages",
              Routes = new RouteValueDictionary(new { action="Messages", controller="UserCP" })
           });
           links.Add(new NavigationLink{
              Text = "Account",
              Routes = new RouteValueDictionary(new { action="Account", controller="UserCP" })
           });
           return links;
       }

  }

Теперь, когда у вас все настроено, вызвать эти функции просто:

В вашем файле просмотра (.aspx / .ascx)

  <ul class="horizontal_menu">
      <% Html.RenderPartial("NavigationLink", MyMvcApplication1.Menus.MainMenu()) %>
  </ul>

Такая настройка позволяет создавать различные частичные представления для отображения списков навигационных ссылок по-разному, и для этого потребуется только создать частичное представление и вызвать его.

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