# 基础信息

# 传值方式

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方法
    html扩展控件

    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();
}