ASP.NET MVC是一种构建web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架;
ASP.NET约定优于配置;基本分为模型(对实体数据的描述)、视图(一个动态生成HTML页面的模板)、控制器(协调用户的请求返回模型实体或返回其他数据根据对应模板动态生成html返回给用户)
请求都是先经过Controller找到下面的Action(即返回值为ActionResult的方法);在默认路由的情况下,/Home/Index 则请求的是HomeController类下面的Index方法,返回视图名称为Index的视图;HomeController名称必须是整个MVC程序中唯一的类名称,访问HomeController不需要区分文件夹的嵌套;HomeController查找Index视图模板(在不具体指定渲染哪个模板的时候)是先查找Views文件下面的Home文件下的index名称的模板;如果没有就会查找Views下面的Shared文件下的index名称的模板;
以下将从视图、控制器、模型以及一些相关知识点讲起;
Razor视图(模板):它本身不会被直接访问,浏览器不能指向一个视图并渲染它,然而,视图总是被一个控制器渲染,该控制器向它提供了要渲染的数据;
Razor视图语法:
1、 模板中定义代码块
<body> <div> @{ string time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } @time </div> </body>
即可以在页面打印时间
2、代码与HTML标签嵌套书写@开始即为C#语义解释
@{ List<string> strs = new List<string>() { "测试1", "测试2", "测试3" }; } @foreach (var item in strs) { <li style="margin-left:30px;font-size:12.5px;">@item</li> }
3、 当定义如下
@{ string name = "name"; } <li>@name.Model</li>
我们想输出name.Model的时候视图解释的时候就不会被编译通过;此时就需要@(name).Model这样才能输出name.Model,括号是告诉解释器括号内的东西需要进行编译解释;
4、 现在我们想在视图中打印出邮箱后缀@qq.com此时Razor会将@qq.com当作C#代码来解释执行,这时我们需要2个@来对一个@进行转义,比如@@qq.com;但是如果我们输入184057662@qq.com与184057662@@qq.com结果都是一样的;因为在@前面有字符串连接,后面会自动当作字符串处理;而@@会被转义成一个@所以两个结果是一样;(输出@还可以使用@代替)
5、 接上面,qq是一个C#代码的变量,我们需要打印184057662@qq.com该如何?如何?
@{ string qq = "telnet"; } 184057662@qq.com
现在视图完全理解错了我的意思;此时我们只要按照3中的解决办法给@qq改为 @(qq)即可输出184057662telnet.com
6、 页面中除了文本还会有js,我们定义如下:
@{ string mess = "<h1>Hello Razor</h1>"; } @mess
此时输出的文本就是原来定义的字符串文本,会把Hello Razor变为H1标签包裹;
此时有两种方法处理第一种是我们需要用到Html辅助方法进行处理@Html.Raw(mess)将mess进行html编码后进行输出
另一种是在定义的时候创建MvcHtmlString
@{ string mess = "<h1>Hello Razor</h1>"; MvcHtmlString messHtml = new MvcHtmlString(mess); } @messHtml
同样也适用于定义mess=” <script>alert('Hello Razor');</script>”的脚本提示;
7、 在代码中定义如下
@{ bool showMess = true; } @if (showMess) { this is TextAreaExtensions }
我们在判断完showMess的值后只想打印文本this is TextAreaExtensions,但razor却还认为括号里面是表达式;此时我们需要在里面用<></>括号的标签折断if语义的继续判断一般嵌套一个<div></div>即可;
或者按照如下
@if (showMess) { @:this is TextAreaExtensions }
8、 服务器端的注释为@**@
9、 视图布局模板(母版页)
<body> <div class="page"> <div id="main"> @RenderBody() </div> </div> </body>
在main div中有个@RenderBody();在需要用到母版页的cshtml中如下即可
@{ Layout = "~/Views/Shared/_Layout.cshtml"; } <p> 将内容放置在此处。 </p>
在视图中如果不主动指定Layout为具体母版或null则会默认寻找/Views/_ViewStart.cshtml页面为母版页;
还可以在页面中添加一些页脚节点比如
<body> <div class="page"> <div id="main"> @RenderBody() </div> <div id="footer"> <footer>@RenderSection("Footer") </footer> </div> </div> </body>
使人页脚节点如下:
@{ Layout = "~/Views/Shared/_Layout.cshtml"; } <p> 将内容放置在此处。 </p> @section Footer{ 这是页脚节点 }
Razor视图只是MVC中视图引擎中的一种,还有我们熟知的aspx视图引擎,还有很多第三方的视图引擎比如:Spark、NHaml、Brail等;所以至此,千万不要把视图当成普通的页面来看待,视图引擎可以根据Controller的控制编译出页面呈现给用户;