园子里写的文章的都是把控制器从传统的项目中的Controllers拿出来单独放
,但很少几乎没有把视图从Views拿出去这样的文章,今天来写一个.

其实很简单!一步步解决问题就行了,下面记录如下,供需要的同学参考,写的不好,轻喷,谢啦

首先咱们自己建一个MyCustomView文件夹 下面建一个Home文件夹里面放Index.cshtml视图

删除原来Views/Home/Index.cshtml

很明显这个时候访问Home/Index肯定会出现最经典的错误

原来MVC找视图的时候是根据路由去找对应视图的

通过razor视图引擎的默认视图位置去找视图

步骤一:我们在Global.asax.cs中的Application_Start方法加下面的代码

ViewEngines.Engines.RemoveAt(0);

ViewEngineCollection vec = ViewEngines.Engines;

RazorViewEngine razor = vec[0] as RazorViewEngine;

razor.ViewLocationFormats = new string[]{"~/Views/{1}/{0}.cshtml","~/Views/Shared/{0}.cshtml","~/MyCustomView/{1}/{0}.cshtml"
};

其实就是做了一个小小的优化,让mvc找视图的时候不找vb那些视图以及加了一个自定义的视图路径"~/MyCustomView/{1}/{0}.cshtml"

这个时候我们再访问Home/Index依然有问题(虽然找到了视图) 问题变了

这个时候很明显,已经开始在我们自定义加的视图文件夹下面开始找视图了.但是找到了,却提示这个视图文件没派生自 WebViewPage 或 WebViewPage<TModel>。

我们知道Razor视图最终都会编译成一个类,这个类会自动继承WebViewPage
或 WebViewPage<TModel>,(这个是强类型视图了..)(大家可以用反编译工具看见)

但是我们把视图从Views下面拿出来了, MVC框架就不会编译的时候让他继承WebViewPage 或 WebViewPage<TModel>

步骤二:那么既然你MVC框架不给我们的视图继承这个,我们自己就不能来吗?用大拇指想想就知道肯定是可以的了!

两种方法:

第一种:这种最简单.把Views下面的web.config文件复制一个到MyCustomView下面,这样错误就没有了!就可以正常访问找到视图了

原理就是

上图中Views文件夹下面的Web.config中有一个节点配置了这么一句话<pages pageBaseType="System.Web.Mvc.WebViewPage"> .很明显是继承WebViewPage
的意思

有这个,此文件夹里面所有的视图编译的时候会自动运行这个,肯定就继承了WebViewPage

视图文件多的时候很适合这样做哦

我们知道ASP.NET框架对Web.config是有就近原则和继承原则的,也就是你在网站根目录的Web.config下面的配置,适用于网站下面所有的程序,当你在子文件下面再有Web.config的时候,他会就近选择使用(如果配置局部,想不使用全局配置,就可以自己加一个配置文件哦,是不是有点类似CSS中的就近原则,哈哈)

第二种:直接在视图中加一句指令

@inherits System.Web.Mvc.WebViewPage

作用不言而喻,当前视图会继承WebViewPage
,但多个视图的时候每个里面都写一句这个烦不烦!!所以不推荐这个啦!

有问题欢迎留言,把控制器放到单独的类库项目(单独的程序集)中这里就不写了很简单,园子文章太多了

实战:ASP.NET MVC中把Views下面的视图放到Views文件夹外的更多相关文章

  1. MVC中的Views下面的视图放到Views文件夹外

    实战:把ASP.NET MVC中的Views下面的视图放到Views文件夹外   园子里写的文章的都是把控制器从传统的项目中的Controllers拿出来单独放,但很少几乎没有把视图从Views拿出去 ...

  2. Asp.Net MVC中记录错误日志保存到本地txt文件

    为了方便查询系统出错弄个错误日志出来对于维护运维来说是很有必要的. 1.在Asp.Net MVC项目中的App_Start添加一个用于处理异常类的文件ErrorLog让他继承HandleErrorAt ...

  3. ASP.NET MVC中,怎么使用jquery/ajaxForm上传文件

    ajaxForm插件最好选择:jquery forms plugin. 以下为示例: Ajax.BeginForm @using (Ajax.BeginForm("YourAction&qu ...

  4. ASP.NET Identity系列02,在ASP.NET MVC中增删改查用户

    本篇体验在ASP.NET MVC中使用ASP.NET Identity增删改查用户. 源码在这里:https://github.com/darrenji/UseIdentityCRUDUserInMV ...

  5. 关于 ASP.NET MVC 中的视图生成

    在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通 ...

  6. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

  7. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  9. ASP.NET MVC中的错误处理

    ASP.NET MVC中的错误的错误处理跨越了两个主要领域:程序异常和路由异常的处理.前者是关于在控制器和视图中捕获错误的;而后者更多是有关重定向和HTTP错误的. 1.在WebConfig中把过滤器 ...

随机推荐

  1. CreateJSのTweenJS、SoundJS、PreloadJS

    TweenJS基础实例: var canvas = document.getElementById('myCanvas'), stage = new createjs.Stage(canvas); v ...

  2. Ubuntu 安装JDK步骤 ,提示没有那个文件或目录

    作为一个程序员,配置环境是最基本的功夫,然而我却捣鼓了一下午,包括安装Ubuntu,安装JDK和配置环境变量. 简单记录下自己的安装过程: 1  下载JDK tar包,使用tar -xzvf jdk* ...

  3. 使用retrofit注意

    retrofit-1.7.1 依赖以下包 okhttp-2.0.0 okio-1.0.0 okhttp-urlconnection-2.0.0 ExtCertPathValidatorExceptio ...

  4. C#和.NET Framework的关系

    Year .NET Framework C# 2002 1 1 2003 1.1 1 2005 2 2 泛型 2006 3 2 WPF\WCF\WF 2007 3.5 3 LINQ 2010 4 4 ...

  5. DataGridView很详细的用法(转载)

    一.DataGridView 取得或者修改当前单元格的内容: 当前单元格指的是 DataGridView 焦点所在的单元格,它可以通过 DataGridView 对象的 CurrentCell 属性取 ...

  6. 制作6寸 kindle pdf

    设置word 纸张大小为 90mm*117mm 然后保存为 pdf 就好了.

  7. Android UI系列-----EditText和AutoCompleteTextView

    在这篇随笔里将主要讲解一下EditText和AutoCompleteTextView这个控件 1.EditText 首先我们先简单来说说EditText这个控件,这个就相当于我们平常web开发中的文本 ...

  8. Red Hat dhclient

    如果你是通过dhcp动态获取ip进行上网,我们一般情况下需要对/etc/sysconfig/network-scripts目录下对应的网卡配置进行修改,将BOOTPROTO改为dhcp.更简单的方法是 ...

  9. C#按需序列化对象为Json字符串

    只贴代码,不解释了.新的代理类型确实很给力! public static class JsonHelper { public static string ToJsonString<T>(I ...

  10. Fedora 手动删除系统中不再需要的包

    最新文章:Virson‘s Blog 1.安装yum-utils yum install yum-utils 2.使用package-cleanup --leaves列举系统中不再需要的包 packa ...