MVC-初识
RAZOR视图介绍
一个cshtml,主体是一个html文本,里面可以写前台和后台代码,混合编写(个人认为不太好,应该分离),这个文件最后会被会被编译为一个类(所以他可以像类一样写一些方法,其他的地方调用)。
cshtml对应的有razor视图引擎,
RAZOR语法
Razor标识符
@为服务器代码标识符,@UserName @{....}
输出HTML
@UserName @Html.XXX 需要注意这些直接数据的,必须有返回值(例如: @Html.Partial() @{Html.RenderPartial()})
输出文本@:
@:我是要输@出的内容
<text>sdfsdf</text> 输出文本
@{ Response.Write(456);} 因为cshtml文件会在后台处理变成html然后写入response响应流,但是这个直接写入到响应流中。所以他应该在页面上面,因为他先写入响应流。
视图解析过程 视图一行一行解析,解析的东西render到内存缓存区。等全部解析完后, 然后在写入到response中。
@{ ViewContext.Writer.Write("789W");}
@@ 输出@
作用域
@{} 里面像写后台代码一样。
@{
var username="123";
@username;
}
@if(1==2){
}
混合编写
<div class="checkbox"> <input type="text" value="@Model.Password" /> @Html.CheckBoxFor(m => m.RememberMe) @Html.LabelFor(m => m.RememberMe) </div>
@foreach (var account in Model.CurrentLogins) { <tr> <td>@account.LoginProvider</td> <td> @if (ViewBag.ShowRemoveButton) { using (Html.BeginForm("RemoveLogin", "Manage")) { @Html.AntiForgeryToken() <div> @Html.Hidden("loginProvider", account.LoginProvider) @Html.Hidden("providerKey", account.ProviderKey) <input type="submit" class="btn btn-default" value="删除" title="从你的帐户中删除此 @account.LoginProvider 登录名" /> </div> } } else { @: } </td> </tr> }
类型转换 类型判断
@name.AsInt() @name.IsInt()
@name.AsFloat() @name.IsFloat()
。。。
帮助类helper
因为cshtml最后被编译为一个类,为后台代码,所以里面可以写一些函数。
@helper sum(int a, int b) { var resu = a + b; @resu }
注意:服务器会把cshtml页面进行一次转换成html,然后response出来
Razor常用函数
扩展控件 @html.。。。 可以自己扩展控件
@Href()
@Html.Raw()
@Html.RouteLink () 会去查找路由,根据第一个符合的生成连接。
LayOut布局页
布局页就相当于webform中的母版页,@RenderBody() 主体部分,使用该布局页的子页会自动把内容加载到@RenderBody()里面。
@RenderPager("路径 带文件后缀名", new {ID=1,Name="123" }) 可以指定参数 对应的页面获取参数 @PageData["ID"]。注意这个页面不能使用父页面中的ViewData ViewBag model等数据,但是partial可以
约定俗称:所有的页面都会继承_ViewStart.cshtml页面 这个页面中默认指定了布局页。(部分视图不会继承这个页面)
当我们的页面未指定layout时候,如果项目在全局或者同文件夹里面存再_ViewStart.cshtml文件,该页面会使用这个_ViewStart.cshtml中的layout
如果不同的文件夹中都存在_ViewStart.cshtml文件,则会使用最近的一个文件。(区域里面的视图也可以指定自己的)
@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
也可以在具体的cshtml页面中指定布局页
Session区域
也是在LayOut重使用的。父页面中@RenderSection("名字",false) 子页中@section 名字{} 一般是写页面所有的js css等项
@RenderSection("scripts", required: false)
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Partial RenderPartial
可以使用父页面的ViewData ViewBag等数据,以及数据模型。
@{Html.RenderPartial("../Shared/ADV");} 在分布视图中可以使用父页面的模型
@{Html.RenderPartial("../Shared/ADV", "sdfjoiv");} 指定好模型
@{Html.RenderPartial不会生成缓存
@Html.Partial()直接会生成缓存
Action RenderAction
经过路由 然后到控制器
用法和partial一样
Action中返回PartilResult return PartialView();
总结RenderPartial适合用户重复的控件,并且可以用model来加载。RenderAction适合通过后台代码在计算 获取数据等来使用,Action也可以做控件,不过是那种有逻辑数据库打交道的。RenderPage 需要路径 文件名字。
其他注意事项
1、引入命名空间
具体页面加入
Action中Return View(模型)
@using WebApplication14.Areas.System
使用 获取属性
@Model.属性
配置文件加入
总结:其实这些在cshtml中写后台代码,导致前后端混合,不建议这么写,应该完全分离。但是微软设计这个框架,为了兼容所有的情况,做了这种功能。大家可以用也可以不用。
团队工作很多东西都是分开的,模块化。接口 类 业务 项目 技术......。以便于快速开发以及维护扩展。但是很多小的公司以及小的项目 为了节约成本和时间 需要的是全栈工程师。一个人开发。就导致各种混合。