当前位置:  编程技术>.net/c#/asp.net

asp.net MVC进阶学习---个性化目录结构(三)

    来源: 互联网  发布时间:2014-08-30

    本文导语:  在网上看到的一个不错的asp.net MVC学习系列,希望可以帮助那些正在研究MVC的朋友们。 本部分内容:asp.net MVC进阶学习---个性化目录结构(三) 。 (一) 目录结构   看到上面的目录结构 会有耳目一新的感觉,终于突破了原有的M...

在网上看到的一个不错的asp.net MVC学习系列,希望可以帮助那些正在研究MVC的朋友们。
本部分内容:asp.net MVC进阶学习---个性化目录结构(三) 。

(一) 目录结构

  看到上面的目录结构 会有耳目一新的感觉,终于突破了原有的MVC目录结构。该目录结构除了使用原有的Controllers 文件夹之外,我们还使用了Games自定义文件夹中的Controllers。在Users文件夹中也同样还有一个Controllers文件夹,这些文件夹都是存放控制器类的。我们可以根据自己的需要建立不同的Controller 组。

  在大型项目开发的过程中,模块的数量可能会很多,仅仅只靠原有的目录结构是不能满足我们的要求的,而且扩展性也不是太好,因为思想就被束缚在它本身的结构上,扩展谈何容易。但真正的作为一个企业级架构这肯定是不行的,最起码走起来比较困难。于是控制器组,个性化的目录就是解决方案的开始。

(二) 扩展路由配置(RouteCollection 类的扩展)
  我们都知道 .net3.0 3.5 中出现的扩展方法使.net 出现了新的生机,我们不必在为系统方法的不适用而烦恼,也不用为其思维的束缚的叫苦不迭。扩展方法能使我们能够扩展系统中的任何一个类,给它重新添加自己想要的方法。
 

代码如下:
public class Student
      {
          private int _id;
 
          public int Id
          {
              get { return _id; }
              set { _id = value; }
          }
 
         private string _name;
 
         public string Name
         {
             get { return _name; }
             set { _name = value; }
         }
     }

  我定义一个实体类,这个类中只有两个属相,没有任何自定方法。现在我们用扩展方法给Student添加一个Write()自定义方法。
   

代码如下:
public static class StudentExtension
     {
         public static void Write(this Student stu, string name)
         {
             Console.WriteLine(name);
         }
     }

   扩展方法的使用代码:
  

代码如下:
public class Test
      {
          public void Show()
          {
              Student stu = new Student();
              stu.Id = 1;
              stu.Name = "ddd";
              stu.Write(stu.Name);
          }
     }
 

  注意:
    扩展方法必须在静态类中,而且扩展方法也必须用static修饰。扩展方法的第一个参数用this修饰,参考上面的就可以知道,当我们使用这个扩展方法的时候 参数就static 修饰方法中的非this修饰的参数,说的有点绕口。相信能够明白。

    RouteCollection扩展类,扩展路由设置

代码如下:
public static class AreaRouteHelper
     {
         public static void CreateArea(this RouteCollection routes,
             string areaName,
             string controllerNameSpace,
             params Route[] routeEntries)
         {
             foreach (Route route in routeEntries)
             {
                 if (route.Constraints == null)
                 {
                     route.Constraints = new RouteValueDictionary();
                 }
 
                 if (route.Defaults == null)
                 {
                     route.Defaults = new RouteValueDictionary();
                 }
 
                 if (route.DataTokens == null)
                 {
                     route.DataTokens = new RouteValueDictionary();
                 }
 
                 route.Constraints.Add("area",areaName);
                 route.Defaults.Add("area",areaName);
                 route.DataTokens.Add("namespaces",new string[]{controllerNameSpace});
 
                 if (!routes.Contains(route))
                 {
                     routes.Add(route);
                 }
             }
         }
     }    

  对于自定义视图的关键还是如下:WebFormViewEngine 定义了视图文件的显示,我们可以继承改类从而重载覆盖父类的方法达到自己定义文件映射路径的目的。
   

代码如下:
public class AreaViewEngine:WebFormViewEngine
     {
         public AreaViewEngine()
             : base()
         {
             //定义页面文件或者用户控件文件的路径规则
             ViewLocationFormats = new string[] {
                 "~/{0}.aspx",
                 "~/{0}.ascx",
                 "~/Views/{1}/{0}.aspx",
                 "~/Views/{1}/{0}.ascx",
                 "~/Views/Shared/{0}.aspx",
                 "~/Views/Shared/{0}.ascx"
             };
 
             //第一母版页文件路径规则
             MasterLocationFormats = new string[] {
                 "~/{0}.master",
                 "~/Shared/{0}.master",
                 "~/Views/Shared/{0}.master",
                 "~/Views{1}/{0}.master"
             };
 
             PartialViewLocationFormats = ViewLocationFormats;
         }
 
 
         ///
         /// 匹配页面文件的,寻找相应的部分视图文件
         ///
         ///
         ///
         ///
         ///
         public override ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache)
         {
             ViewEngineResult viewResult = null;
             if (controllerContext.RequestContext.RouteData.Values.ContainsKey("area"))
             {
                 string areaPartialName = FormatViewName(controllerContext,partialViewName);
                 viewResult = base.FindPartialView(controllerContext,areaPartialName,useCache);
                 if (viewResult != null && viewResult.View != null)
                 {
                     return viewResult;
                 }
 
                 string sharedAreaPartialName = FormatPartialViewName(controllerContext, partialViewName);
                 viewResult = base.FindPartialView(controllerContext,sharedAreaPartialName,useCache);
                 if (viewResult != null && viewResult.View != null)
                 {
                     return viewResult;
                 }
             }
             return base.FindPartialView(controllerContext, partialViewName, useCache);
         }
 
         ///
         /// 匹配页面文件的,寻找相应的试图文件
         ///
         ///
         ///
         ///
         ///
         ///
         public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
         {
             ViewEngineResult viewResult = null;
             if (controllerContext.RequestContext.RouteData.Values.ContainsKey("area"))
             {
                 string areaPartialName = FormatViewName(controllerContext, viewName);
                 viewResult = base.FindView(controllerContext, areaPartialName,masterName, useCache);
                 if (viewResult != null && viewResult.View != null)
                 {
                     return viewResult;
                 }
 
                 string sharedAreaPartialName = FormatPartialViewName(controllerContext, viewName);
                 viewResult = base.FindView(controllerContext, sharedAreaPartialName,masterName, useCache);
                 if (viewResult != null && viewResult.View != null)
                 {
                     return viewResult;
                 }
             }
             return base.FindView(controllerContext, viewName, masterName, useCache);
         }
 
         ///
         /// 这个匹配一般的页面文件或用户控件路径
         ///
         ///
         ///
         ///
         public string FormatViewName(ControllerContext context, string viewName)
         {
             //根据路由的参数值获得控制器的名称
             string controllerName = context.RouteData.GetRequiredString("controller");
 
             //根据路由的参数获得控制器组的名称
             string area = context.RequestContext.RouteData.Values["area"].ToString();
             return "Area/" + area + "/Views/" + controllerName + "/"+viewName ;
         }
 
         ///
         /// 这个一般匹配母版页的文件路径
         ///
         ///
         ///
         ///
         public string FormatPartialViewName(ControllerContext context, string viewName)
         {
             //根据路由的参数获得控制器组的名称
             string area = context.RequestContext.RouteData.Values["area"].ToString();
             return "Area/" + area + "/Views/Shared/" + viewName;
         }
     }

     原文作者:情缘 http://www.cnblogs.com/qingyuan


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • ASP.NET之 Ajax相关知识介绍及组件图
  • 我想了解一些关于Java怎样与Asp或Asp.net结合方面在未来发展方向的问题?
  • c#/ASP.NET操作cookie(读写)代码示例
  • asp.net UrlEncode对应asp urlencode的处理方法
  • asp.net实例 定义和使用asp:AccessDataSource
  • win2008 r2 服务器环境配置(FTP/ASP/ASP.Net/PHP)
  • asp与asp.net的session共享
  • 如何在unix下发布asp?
  • 怎么让Apache支持Asp?
  • ??谁能把ASP代码改为JSP的
  • Linux平台下哪种方法实现ASP好?
  • ASP和ASP.Net共享Session解决办法
  • 通过socket和asp打交道
  • 犹豫中……,到底是选择ASP,还是JSP?
  • asp 是否 可用applet标签?帮忙!!
  • asp.net判断数据库表是否存在 asp.net修改表名的方法
  • 新人提问:asp+access的程序在linux下怎么改?
  • 用JAVA APPLET做的交互式网页和ASP、PHP做的相比有什么优势呢?
  • asp.net文字水印功能简单代码
  • asp里面可否使用java写的邮件,给30分.
  • asp与Jsp可否在iis中共存的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3