博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC学习之视图篇(1)
阅读量:7080 次
发布时间:2019-06-28

本文共 5130 字,大约阅读时间需要 17 分钟。

一.前言

不知道还有多少读者从第一篇开始一直学习到如今,笔者也会一直坚持将ASP.NET MVC的学习完美的结束掉,然后开始写如何配合其他框架使用ASP.NET MVC的随笔。当然笔者后面的随笔如果没有特殊说明使用的都是ASP.NET MVC 4,因为笔者认为只要精通即可。

 

二.正文

 

1.自定义视图引擎

相信很多人都知道在控制器中一个动作方法返回一个View之后,ASP.NET MVC默认会到Views下对应的控制器名的文件夹下寻找和这个动作方法同名的视图(如果你指定了视图名则会按照你指定的视图名查找)。但是这中间是如何做到的呢?其实多亏ASP.NET MVC的灵活性强的特点,当你返回View之后,控制器会通过一组视图引擎去查找对应的页面,如果其中一个视图引擎返回了符合的视图则结束查找开始渲染视图。下面我们就开始分析上面这几个过程中涉及的接口有哪些。

 

首先是视图引擎,它要能够根据要求返回符合的视图(实现Iview接口),而视图引擎需要实现IViewEngine接口,IViewEngine接口代码如下所示

1     public interface IViewEngine2     {3         ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache);4         ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache);5         void ReleaseView(ControllerContext controllerContext, IView view);6 }

 其中FindView是根据要求返回对应的视图,其中ControllerContext包含了控制器相关的数据,viewName则是视图的名称,useCache表示是否使用缓存,FindPartialView则是查找分布视图,最后一个ReleaseView则是释放页面对象。

 

这里我们可以看到FindPartialViewFindView都要求返回ViewEngineResult类型,而该类的构造函数有以下几种方式

1 public ViewEngineResult(IEnumerable
searchedLocations);2 public ViewEngineResult(IView view, IViewEngine viewEngine);

其中第一个是当未查找到时返回的,其中参数是表示该引擎查找了哪些路径,而第二个则是查找成功后返回的其中要求输入一个实现IView接口的对象,

第二个参数一般都是this,主要是用来最后调用视图引擎的ReleaseView方法的,到这里我们就要将视角转向IView接口,以下是该接口的代码

 

1 public interface IView2 {3     void Render(ViewContext viewContext, TextWriter writer);4 }

 大家可以看到这接口的方法很少,只有一个Render,而这个方法就是负责最后生成页面html代码的,我们可以看到第一个参数是ViewContext,这个参数包含了控制器传递到视图中的参数,比如ViewBag,ViewData等,而第二个参数是用来写入html代码的。下面我们简单的举一个小例子。

 

首先我们创建一个实现IView接口的对象:

1 namespace MvcStudy.View 2 { 3     public class CustomView : IView 4     { 5         public void Render(ViewContext viewContext, System.IO.TextWriter writer) 6         { 7             writer.Write("from custom view"); 8         } 9     }10 }

 

 

这里我们直接输出了一个字符串。接着我们还要实现IViewEngine接口:

1 namespace MvcStudy.View 2 { 3     public class CustomViewEngine : IViewEngine 4     { 5  6         public ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName, bool useCache) 7         { 8             return new ViewEngineResult(new string[] { "Custom View Engine" }); 9         }10 11         public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)12         {13             if (viewName.Equals("CustomView"))14             {15                 return new ViewEngineResult(new CustomView(), this);16             }17             return new ViewEngineResult(new string[] { "Custom View Engine" });18         }19 20         public void ReleaseView(ControllerContext controllerContext, IView view)21         {22 23         }24     }25 }

 

 这里我们没有为分布视图进行查找,而仅仅只是实现了FindView的查找,并且只有视图名为CutomView时才会返回对应的结果。

完成了上面的操作,最后我们还要将我们的视图引擎加入到视图引擎组中,下面我们在Global.asaxApplication_Start中写入如下代码

1 ViewEngines.Engines.Add(new CustomViewEngine ());

 

 

然后修改Home控制器中Index动作方法:

1 namespace MvcStudy.Controllers 2 { 3     public class HomeController : Controller 4     { 5         public ActionResult Index() 6         { 7             return View("CustomView"); 8         } 9     }10 }

 最后我们运行该程序。最后我们将会看到页面输出了我们之前写的字符串,到此为止我们就能够自己创建自己的视图引擎了。

 

 

2.修改默认的查询路径

可能很多人发现ASP.NET MVC自带的Razor视图引擎非常好,并不想自己去实现视图引擎,而只是想修改查询的路径,比如把 ~/Views/[ConrollerName]/[ActionName].cshtml改成~/Views/[ControllerName]_[ActionName].cshtml这种形式,当然强大的ASP.NET MVC依然可以办到,因为Razor视图引擎的具体实现类是RazorViewEngine,我们可以继承这个类,并修改ViewLocationFormats属性,下面我们将上面的那种查询方式实现,首先我们新建一个CustomRazorViewEngine类,具体代码如下

1 namespace MvcStudy.View 2 { 3     public class CustomRazorViewEngine : RazorViewEngine 4     { 5         public CustomRazorViewEngine() 6         { 7             ViewLocationFormats = new string[]{ 8                 "~/Views/{1}_{0}.cshtml", 9                 "~/Views/Shared/{0}.cshtml"10             };11         }12     }13 }

 

其中的{0}{1}代表的是视图名称和控制器名称,如果读者还要修改区域,则{2}代表区域名称。

 

我们创建好了之后还要加入到视图引擎中(仍然在Global.asax中写入的Application_Start事件中写入):

1 ViewEngines.Engines.Clear();2 ViewEngines.Engines.Add(new CustomRazorViewEngine());

 

然后修改Home控制器的Index动作方法,将之前的传入到View中的参数删除,然后在Views下新建一个Home_Index.cshtml视图,重新运行改成程序。

 

 

3.视图中调用我们自己的方法

有时候视图中一些常用的功能我们都会响应的集中起来,生成一个工具类,但是在视图中调用的时候总是要写入整个命名空间十分麻烦,下面我们可以轻松的解决这个问题。

 

首先我们新建一个工具类:

1 namespace MvcStudy.Utility 2 { 3     public static class ShowHead 4     { 5         public static String Show() 6         { 7             return "

this is head

"; 8 } 9 }10 }

 

 

然后打开~/Views/Home/Index.cshtml视图,在顶部加上@using MvcStudy.Utility,然后我们就可以在下面写入@ShowHead.Show()

当然我们也可以在Views下的Web.config中加入这个命名空间:

1       
2
3
4
5
6
7
8

 

这样所有的视图都可以使用这个工具类了,但是读者的运行之后显示的不会是一个p标签,而是被转义之后的字符,这个是ASP.NET MVC为了方式XSS而设置了,所以这里还有一个问题要解决就是如何输出Html标签,而不会被转义,这里就需要使用MvcHtmlString类了,下面我们修改我们的工具类:

1 namespace MvcStudy.Utility 2 { 3     public static class ShowHead 4     { 5         public static MvcHtmlString Show() 6         { 7             return new MvcHtmlString("

this is head

"); 8 } 9 }10 }

我们看到返回的结果类型从String改成了MvcHtmlString,重新运行程序我们可以发现最后的输出没有被转义了。如果你需要直接输出Modal中的内容,而不想被转义则需要调用@Html.Raw(Model),这样就不会被转义了。

 

转载地址:http://apdml.baihongyu.com/

你可能感兴趣的文章
归档模式下四种完全恢复的场景
查看>>
绝妙好文
查看>>
《VMware Virtual SAN权威指南》一2.3.3 二层或三层
查看>>
《计算机科学与工程导论:基于IoT和机器人的可视化编程实践方法第2版》一1.1.2 计算机就业形势分析...
查看>>
一款成熟的数据中心模型设计
查看>>
论坛程序vBulletin 5曝漏洞 可能已泄露千万用户数据
查看>>
大数据资源争夺战此起彼伏 对用户而言是福是祸?
查看>>
一文读懂分布式系统
查看>>
Flask中的请求上下文和应用上下文
查看>>
Web应用防护系统OpenWAF开源CC防护模块
查看>>
重拾百度定位之踩坑篇(上)
查看>>
联想Luigi Brochard:高性能计算三大战略, 推动人工智能飞速发展
查看>>
芒果贴冯振:我是怎么做老年人产品的
查看>>
软银集团任命新董事 ARM与Sprint CEO正式进入董事会
查看>>
“630”后市场急冷 台湾光伏企业营收下滑
查看>>
Facebook调整动态消息算法:更加重视朋友家人的帖子
查看>>
内蒙古云计算 向国家级基地迈进
查看>>
中生代嘉年华 | OKR管理
查看>>
详解让乌克兰总理都“哭泣”的勒索病毒,你到底要不要怕
查看>>
发展人工智能让用户丧失隐私?库克说不
查看>>