# 基础信息
# 传值方式
ViewBag.User1="张三";
ViewData["User2"]="李四";
TempData["User3"]="王五";
object User4="赵六";
if(HttpContext.Session.GetString("User5")==null){
HttpContext.Session.SetString("User5","天青");
}
//前端:Context.Session.GetString("User5");
return View(User4);
//判断 ViewBag.OnePageOfList是否为空
ViewBag.OnePageOfList.Count>0
# 常用的View文件
- _Layout.cshtml:共用文件
@RenderSection("CSS", false)/@section CSS{}
@RenderSection("bottom",false)
@RenderSection("CSS", false)
- _ViewStart.cshtml:放在View根目录下才会对所有文件起作用,所有View文件默认引用此文件
- _Viewimport.cshtml:引用文件,放在View根目录下才会对所有文件起作用
@using Web.ViewModels;
@addTagHelper*,Microsoft.AspNetCore.Mvc.TagHelpers //tagHelper
- Partial View:复用代码,没有自己的Model,可以嵌套使用
@Html.Partial("_PartialViewName",data)
//tagHelper
@foreach(var item in model){
<partial name="_myPartial" for="item"/>
}
- View Components:可以复用,独立的组件独立的逻辑/逻辑,不依赖于腹肌View的数据
//ViewComponent控制器
public class WelcomeStudentViewComponent:ViewComponent{
public IViewComponentResult Invoke(int id){
string name="张三";
//retrun View("Welcome",name);
retrun View("Default",name);
}
}
//View文件存放,在Shared文件夹下新建Components,然后再建立文件夹Welcome
@await Component.InvokeAsync("Welcome",123);//123是给控制器传递的参数
//tagHelper的写法 必须是小写字母,多个单词用-间隔,需要在_Viewimport先添加引用
@addTagHelper*,Sylone.Web
<vc:welcome-student></vc:welcome-student>;
# IActionResult的返回类型
ActionResult继承了IActionResult
JsonResult、RedirectResult、FileResult、ViewResult、ContentResult均继承了ActionResult
所以IActionResult类型的函数可以返回所有直接继承和间接继承他的类型数据
# 验证数据类型
public class UserInfo{
[required]
[Display(Name="用户名")]
public string name{get;set;}
[required]
[Display(Name="密码")]
[DataType(DataType.Password)]
public string pass{get;set;}
}
public IActionResult Create(StudentModel student){
//验证Model数据类型
if(ModelState.IsValid){
……
}
}
# Html扩展控件
- 方法一
通过一个后台方法,返回一个【已经存在】的Html标签的字符串,浏览器在读取的时候,就读取成一个Html标签
``` c#
/// <summary>
/// 图片
/// </summary>
/// <param name="helper"></param>
/// <param name="src"></param>
/// <returns></returns>
public static IHtmlContent Img(this IHtmlHelper helper,string src,string @class)
{
return new HtmlString($"<img src='{src}' class='{@class}'/>");
}
```
``` cshtml
<!--1.引入命名空间-->
<!--2.使用图片--自定义 扩展方法-->
@Html.Img("https://tpc.goog.com?w=200&h=200","border:1px solid red;")
```
方法二
通过一个后台方法,返回一个【不存在】的Html标签的字符串,在读取的时候,通过制后台方法,去生成我们制定的标签1.写一个扩展方法,定义一个普通类,类名建议以TagHelper结尾,加上特性;如果没有标记特性,视图中在调用的时候使用当前类名去掉TagHelper后缀得到的的字符串来调用。继承TagHelpre抽象类、或者实现接口ITagHelpr,二者选一起均可。然后实现接口Proccss方法
2.在【_ViewImports.cshtml】进行注册
@addTagHelper *.SyloneCore.Web <hello id="12" age="20" name="张三" zhao-xi="sdsd"></hello>
# 自定义视图组件
1.Rzaor组件对应的类需要以ViewComponent结尾,该类需要继承自ViewCompnent类
2.定义一个异步版本的InvokeAsync,可以自定义参数,IncokeAsync就是返回组件内容的方法
3.在Views/Shared文件下建立Components文件夹,在这个文件下创建一个和组件类名相同(如果加了特性,就按照特性上面的名称来)的文件夹,然后创建一个Default.cshtml视图
注意:以上步骤可以不按照上面执行,我们可以随意新建一个视图,然后指定路径就可以了
4.调用
# 视图缓存
在老的版本的MVC里面,有一种可以缓存视图的特性(OutputCache)。
可以保持同一个参数的请求,在N段时间内,直接从mvc的缓存中读取,不去走视图的逻辑。
[OutputCache(Duration =20)]//设置过期时间为20秒
public ActionResult ExampleCacheAction()
{
var time=DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
ViewBag.time= time;
return View();
}
在.Net Core没有了OutputCache,换成了ResponseCache。
ResponseCache必须带一个参数:Duration 单位为秒,最少设置一秒钟。
[ResponseCache(Duration = 5)]
public IActionResult About()
{
ViewBag.time = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
return View();
}
# Vary过滤
告诉缓存服务器或者CDN,我还是同一个浏览器的请求,你给我缓存就行了,如果你换个浏览器去请求,那么vary的值肯定为空,那么缓存服务器就会认为你是一个新的请求,就会去读取最新的数据给浏览器。
[ResponseCache(VaryByHeader = "User-Agent", Duration = 5)]
public IActionResult About()
{
ViewBag.time = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
return View();
}
# 禁用缓存
ResponseCacheLocation.None是在Cache-Control设置一个no-cache属性,让浏览器不缓存当前这个URL
[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult About()
{
ViewBag.time = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
return View();
}
# 缓存配置
在一个正常的项目中,肯定有很多个控制器,但是不可能每个控制器的缓存策略都一样,这时候,我们就需要一个缓存的配置来灵活应对这个问题。
在mvc的服务注入的时候,我们可以在option里面注入进我们的缓存策略。
services.AddMvc(option=> {
option.CacheProfiles.Add("test1", new CacheProfile()
{
Duration = 5
});
option.CacheProfiles.Add("test2", new CacheProfile()
{
Location = ResponseCacheLocation.None,
NoStore = true
});
});
然后我们在使用的时候,直接使用配置策略的名称就好了。
[ResponseCache(CacheProfileName = "test1")]
public IActionResult About()
{
ViewBag.time = DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒");
return View();
}
← 常用方法 EntityFramework →