Чтобы ответить на ваши вопросы:
Существует множество способов создания навигационных ссылок для ASP.NET MVC, и то, что работает для вас, является лучшим.
Большинство ответили бы, что файлы классов должны быть помещены в папку Model. Мне показалось более целесообразным поместить классы ViewModel в отдельную папку, а классы, используемые в приложении (бизнес-логика / сущность приложения), в отдельный файл.
То, что вы пытаетесь выполнить, похоже на работу для методов расширения. Вот хороший учебник: http://www.dotnetcurry.com/ShowArticle.aspx?ID=406&AspxAutoDetectCookieSupport=1
То, что вы делаете, находится на правильном пути, однако вам нужно создать статические классы и статические функции / методы для правильной работы.
http://msdn.microsoft.com/en-us/library/bb383977.aspx содержит общую информацию о методах расширения.
Одно быстрое примечание: чтобы разрешить использование всех созданных вами методов расширения, вам нужно сослаться на класс / пространство имен, в которое вы их поместили.
Есть два способа сделать это:
Предполагая, что вы разместили методы расширения в MvcApplication1.MyExtensionMethods, добавьте следующее после
<page>
<namespaces>
тег в файле web.config вашего приложения (не в файле web.config представления)
<add namespace="MvcApplication1.MyExtensionMethods"/>
Это позволит использовать методы расширения во всех ваших файлах представлений (.aspx / .ascx).
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>
Такая настройка позволяет создавать различные частичные представления для отображения списков навигационных ссылок по-разному, и для этого потребуется только создать частичное представление и вызвать его.