@Html.DisplayNameFor(m=>m.ID)
    @Html.DisplayFor(m=>m.ID)
    Birth @Model.Birth
    Name @Model.Name
复制代码
 
 
 强类型视图:
 
    
 
弱类型视图缺少智能提示:
最终结果:
 
 
 
 
 
 
ViewData
  ViewData是一个DictionaryID: @student.ID
Name: @student.Name
Birth: @student.Birth
@Html.ActionLink("Test","Test") 复制代码 用来测试跨请求的 Test 方法和视图: 复制代码 1 public IActionResult Test() 2 { 3 return View(); 4 } 复制代码 复制代码 @{ ViewData["Title"] = "Test"; }
Test
@ViewData["test"] 复制代码 结果: Test视图: 直接使用 ViewData 中数据的属性: 在视图和部分视图间使用 ViewData 时,部分视图中的 ViewData 的定义不会覆盖原视图的 ViewData 。在视图和部分视图之间传递 ViewData 时,主要使用的是 PartialAsync 辅助器方法以及ViewDataTest2
@{ ViewData["Student"] = new Student() { ID = 1, Birth = DateTime.Now, Name = "Nanase" }; ViewData["Greeting"] = "Good morning"; } View: @ViewData["Greeting"]@await Html.PartialAsync("PartialView",new ViewDataDictionary(ViewData)) View: @ViewData["Greeting"] 复制代码 PartialView 视图: 复制代码 @{ Student student = ViewData["Student"] as Student; } Partial: @ViewData["Greeting"]
ID: @student.ID
Name: @student.Name
Birth: @student.Birth
@{ ViewData["Greeting"] = "Good afternoon"; }
Partial: @ViewData["Greeting"]
复制代码
 
 
 
结果:
 
使用 partial 标记辅助器方法:
关于 partial 标记辅助器方法:https://docs.microsoft.com/zh-cn/aspnet/core/mvc/views/partial?view=aspnetcore-2.1
使用时,为 name 属性传递部分视图的名称,为 view-data 属性传递 ViewDataDictionary 对象的名称:
复制代码
ViewDataTest2
@{ ViewData["Student"] = new Student() { ID = 1, Birth = DateTime.Now, Name = "Nanase" }; ViewData["Greeting"] = "Good morning"; } View: @ViewData["Greeting"]@*@await Html.PartialAsync("PartialView",new ViewDataDictionary(ViewData))*@
ViewBagTest
View: @(ViewBag.Student.ID+1)
 
 @await Html.PartialAsync("_ViewBagPartial")
复制代码
 
_ViewBagPartial 视图:
复制代码
 ID: @ViewBag.Student.ID
 Name: @ViewBag.Student.Name
 Birth: @ViewBag.Student.Birth
复制代码
 
结果:
 
 
 
 
 
 
TempData
TempData 是一个继承自 System.Web.Mvc.TempDataDictionary 的类型,是一个 DictionaryTempDataTest
@TempData["error"]
 
@*访问 TempData["greeting"] 并将 TempData["greetng"] 延长一次*@
 @TempData.Peek("greeting")
 @Html.ActionLink("Another", "Index", "TempData")
 @Html.ActionLink("ReceiveTempData","ReceiveTempData")
复制代码
 
用来测试跨请求的 ReceiveTempData 视图:
复制代码
 @{
     ViewData["Title"] = "ReceiveTempData";
 }
 
 ReceiveTempData
@TempData["error"]
 
 @*将 TempData["greetng"] 生命期延长一次*@
 @TempData.Peek("greeting")
 @Html.ActionLink("ReceiveTempData2", "ReceiveTempData2") 复制代码 ReceiveTempData2 视图: 复制代码 @{ ViewData["Title"] = "ReceiveTempData2"; }
ReceiveTempData2
@TempData["error"]
 @TempData["greeting"]
复制代码
 
另一个控制器 TempDataController:
复制代码
1     public class TempDataController : Controller
2     {
3         public IActionResult Index()
4         {
5             return View();
6         }
7     }
复制代码
该控制器的 Index 视图:
复制代码
@{
    ViewData["Title"] = "Index";
}
Index
@TempData["error"]
复制代码
 
 
结果:
          
    
 
 
使用重定向:
复制代码
1         public IActionResult TempDataTest()
2         {
3             TempData["error"] = "An error";
4             TempData["greeting"] = "Hello";
5             TempData.Keep("error");
6             //return View();
7             return RedirectToAction("ReceiveTempData");
8         }
复制代码
 
结果:
 
本应被延长的 TempData["error"] 没有被延长。
 
 
 
 
 
Session
session 是从Web.SessionState 继承的键值对对象。在控制器之间传递数据,可用于跨请求状态下控制器和视图之间的数据传递。一般Session用于保留对特定用户的数据,但最好不要在其中放置敏感数据。生存期一直持续到 timeout 参数所限制的事件、调用Clear、RemoveAll、Abandon 方法或者关闭浏览器来明确地销毁它。最好减少 Session 的使用因为它在服务器集群环境下不可靠,并且在使用时将一直占用服务器资源。
在使用 Session 时需要在 Startup.cs 中对其进行配置(配置详情)。
 
 
使用方法:
在此我们将 Session 的过期时间设置为 5 秒,该过期时间在每次操作之后进行计算。
在 ConfigureServices 方法中:
复制代码
1         services.AddDistributedMemoryCache();
2 
3         services.AddSession(options =>
4         {
5        options.IdleTimeout = TimeSpan.FromSeconds(5);
6         options.Cookie.HttpOnly = true;
7     });
复制代码
在 Configure 方法中:
1         app.UseSession();
2         app.UseMvc();
 中间件的顺序很重要。 在 UseMvc 之后调用 UseSession 时会发生 InvalidOperationException 异常。
 
在默认的 ASP.NET Core 实现中,在 Session 中提供了字节流、int 以及 string 数据的获取和设置方法,分别为:
Get(ISession, String)
GetInt32(ISession, String)
GetString(ISession, String)
SetInt32(ISession, String, Int32)
SetString(ISession, String, String)
为了方便,分别实现一个 Set 和 Get 的 ISession 泛型扩展方法:
复制代码
 1         public static void SetSessionTest2
ID: @Model.ID
 Name: @Model.Name
  Birth: @Model.Birth
复制代码
结果:
直接访问 sessiontest :
 
设置 Session 然后再访问 SessionTest2 :
 
未操作 5s 之后刷新页面,Session 被移除:
 
 
总结表格:
 
 
 
示例代码:https://github.com/NanaseRuri/Differences 
 
参考网页: https://www.mytecbits.com/microsoft/dot-net/viewmodel-viewdata-viewbag-tempdata-mvc
      https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/app-state?view=aspnetcore-2.1https://www.cnblogs.com/gokoururi/p/9931901.html
                    