为MVC创建Web Navigation Helper类

时间:2009-11-11 22:40:55

标签: asp.net-mvc url navigation

我是MVC的新手并试图在我的MVC应用程序中使用web navigator类。 http://polymorphicpodcast.com/shows/webnavigator/ 该类使我们能够在中央类文件中输入强大的URL。

我有3个问题:

  1. 这是最好的存储方式吗? MVC中的强类型URL或者是 MVC有一些特殊的帮助方法 它做同样的事情。

  2. 课程的最佳位置是什么     文件进入例如VIEW / MODEL或
        CONTROLLER

  3. 以下是导航示例         返回适当URL的类         一个图像文件。             而不是将UrlHelper对象传递给我想要的     跑这个         System.Web.Mvc.ViewPage中的类         上下文(当前上下文)。什么是         这样做的最佳方式。

  4. 图片的示例导航器类:

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

1 个答案:

答案 0 :(得分:3)

回答你的问题:

  1. 有很多方法可以为ASP.NET MVC创建导航链接,无论哪种方式都是最适合您的。

  2. 大多数人会回答类文件应该放在Model文件夹中。我发现将ViewModel类放在一个单独的文件夹中并将整个应用程序中使用的类(应用程序的业务逻辑/内容)放在一个单独的文件中更有意义。

  3. 您要完成的任务似乎是扩展方法的工作。这是一个很好的教程:http://www.dotnetcurry.com/ShowArticle.aspx?ID=406&AspxAutoDetectCookieSupport=1

  4. 您正在做的是在正确的轨道上,但是,您需要创建静态类和静态函数/方法才能使其正常工作。

    http://msdn.microsoft.com/en-us/library/bb383977.aspx有一些关于扩展方法的一般信息。

    快速说明:为了允许使用您创建的所有扩展方法,您需要引用放置它们的类/命名空间。

    有两种方法可以做到这一点:

    1. 假设您已将扩展方法放在MvcApplication1.MyExtensionMethods中,请在

      之后添加以下内容
        <page>
            <namespaces> 
      
      应用程序的web.config中的

      标记(不是View的web.config文件)

           <add namespace="MvcApplication1.MyExtensionMethods"/>
      

      这样做将允许在所有视图(.aspx / .ascx)文件中使用扩展方法。

    2. 放置

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

      位于.aspx / .ascx文件的顶部。您需要为使用扩展方法所需的每个文件执行此操作(非效率)

    3. 以下是我实施的内容,迄今为止它对我有好处。

      NavigationLink.cs

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

      NavigationLink.ascx(放置在共享文件夹中以便在整个应用程序中轻松访问)

      (注意:我将链接包含在&lt; li&gt;&lt; / li&gt;标签中,因为我为所有导航控件使用了列表。然后您可以将这些链接放在任何类型的列表中,从而允许自由使用列表的类/式。)

         <%@ 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>
      

      设置这样的设置允许创建不同的部分视图,以不同的方式呈现导航链接列表,并且需要您只构建部分并调用它。