完整了解asp.net core MVC中的数据传递

在ASP.NET Core MVC应用开发中,数据传递是构建高效、可靠Web应用的核心环节之一。它涵盖了从控制器到视图、不同请求之间以及与外部数据源交互等多个方面。正确掌握各种数据传递方式对于开发出性能优良、用户体验良好的应用程序至关重要。本文将全面深入地探讨ASP.NET Core MVC中常见的数据传递方式,包括通过视图模型(ViewModel)、ViewData、ViewBag、临时数据(TempData)、缓存(Cache)、会话(Session),以及在控制器之间传递数据的方法。同时,会详细说明这些方式与ControllerBase的关系,并通过丰富的代码示例阐述其功能和应用场景。

文章目录

    • 一、视图模型(ViewModel)传递数据
      • 1. 概念与原理
      • 2. 代码示例与应用场景
    • 二、ViewData与ViewBag
      • 1. 概念与特点
      • 2. 两者关系及与`ControllerBase`的关系
      • 3. 代码示例与应用场景
    • 三、TempData
      • 1. 功能与特点
      • 2. 与`ControllerBase`的关系
      • 3. 代码示例与应用场景
    • 四、缓存(Cache)
      • 1. 缓存的概念与配置
      • 2. 代码示例与应用场景
    • 五、会话(Session)
      • 1. 会话的特点与工作原理
      • 2. 代码示例与应用场景
    • 六、在控制器之间传递数据
      • 1. 使用TempData在控制器之间传递数据
      • 2. 通过路由参数传递数据
      • 3. 使用共享服务或单例模式传递数据

一、视图模型(ViewModel)传递数据

1. 概念与原理

视图模型是专为视图设计的数据结构,用于在控制器与视图之间传递数据。它能将与特定视图相关的数据和逻辑进行封装,可包含一个或多个模型对象的属性,还可添加仅用于视图展示的额外属性,如页面标题、控制视图显示的布尔值等。其目的是提供清晰、类型安全的方式来传递数据,确保视图代码更易于理解和维护。

2. 代码示例与应用场景

以博客系统为例,Post是文章模型,Comment是评论模型。在展示文章详情页面时,需要文章信息及相关评论列表,此时可创建PostViewModel视图模型来封装数据。

// 文章模型
public class Post
{public int Id { get; set; }public string Title { get; set; }public string Content { get; set; }
}// 评论模型
public class Comment
{public int Id { get; set; }public int PostId { get; set; }public string Text { get; set; }
}// 文章详情视图模型
public class PostViewModel
{public Post Post { get; set; }public List<Comment> Comments { get; set; }public string PageTitle { get; set; }
}// 控制器中的操作方法
public class PostController : Controller
{public IActionResult Details(int postId){var post = _postService.GetPostById(postId);var comments = _commentService.GetCommentsByPostId(postId);var viewModel = new PostViewModel{Post = post,Comments = comments,PageTitle = $"文章详情 - {post.Title}"};return View(viewModel);}
}

在视图中,可通过强类型方式访问视图模型属性:

@model PostViewModel<h1>@Model.PageTitle</h1>
<p>@Model.Post.Content</p><ul>@foreach (var comment in Model.Comments){<li>@comment.Text</li>}
</ul>

应用场景:适用于视图需要展示多个相关模型数据或需对数据进行特定组合与处理的情况,提供了类型安全和清晰的结构。

二、ViewData与ViewBag

1. 概念与特点

  • ViewData:是ControllerBase的属性,类型为ViewDataDictionary,即字典结构(IDictionary<string, object>)。用于在控制器向视图传递数据,以键值对形式存储,数据生命周期在当前请求的视图渲染期间。其优点是简单直接,但作为弱类型字典,编译时无法进行类型检查,可能导致视图中使用数据时出现运行时错误。
  • ViewBag:是ViewData的动态包装器,利用动态属性方式访问数据,如ViewBag.PropertyName,使代码在视图中更简洁。不过,和ViewData一样,编译时不进行类型检查,存在运行时类型不匹配风险。

2. 两者关系及与ControllerBase的关系

ViewBag基于ViewData实现,在ControllerBase中,ViewData直接作为属性存在,ViewBag通过动态属性访问方式对ViewData进行包装。当使用ViewBag设置或获取数据时,实际是在操作ViewData字典中的对应键值对。它们是ControllerBase提供给控制器向视图传递数据的机制。
换句话说ViewBag的访问方式比ViewData更优雅一些,更符合对象编程的手法。

3. 代码示例与应用场景

  • 示例代码
    • 控制器中设置数据
public class HomeController : Controller
{public IActionResult Index(){// 使用ViewData传递数据ViewData["Message"] = "这是一条消息 using ViewData";// 使用ViewBag传递数据ViewBag.Title = "首页 using ViewBag";return View();}
}
- **视图中获取数据(Index.cshtml)**:
@{Layout = null;
}<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /><title>@ViewBag.Title</title>
</head>
<body><p>Message from ViewData: @ViewData["Message"]</p><p>Title from ViewBag: @ViewBag.Title</p>
</body>
</html>
  • 应用场景:适用于传递少量简单、临时数据,如页面标题、提示信息等,数据类型无需编译时严格检查且数据量小、逻辑简单时使用。

三、TempData

1. 功能与特点

TempData也是ControllerBase的属性,用于不同请求间(特别是重定向场景)传递数据。以键值对形式存储,具有一次性读取特性,数据读取一次后标记为删除(下次请求读取为null),可通过Keep方法保留数据以便后续请求使用。

2. 与ControllerBase的关系

TempDataControllerBase提供的在请求间传递临时数据的方式,在控制器操作方法执行中发挥作用。控制器可利用它在不同请求间传递需后续使用但不长期存储的数据,如表单提交重定向后的操作结果或临时消息。

3. 代码示例与应用场景

  • 示例代码
    • 登录控制器
public class LoginController : Controller
{public IActionResult Login(LoginViewModel model){if (ModelState.IsValid){// 假设登录验证成功TempData["SuccessMessage"] = "登录成功!";return RedirectToAction("Index", "Home");}return View(model);}
}
- **首页控制器**:
public class HomeController : Controller
{public IActionResult Index(){var message = TempData["SuccessMessage"];if (message!= null){ViewBag.Message = message;// 保留数据以便后续使用(例如在页面刷新时仍然显示消息)TempData.Keep("SuccessMessage");}return View();}
}
  • 应用场景:常用于重定向后传递操作结果或临时消息给目标页面,如用户注册、登录、表单提交等操作成功或失败后的提示信息。

四、缓存(Cache)

1. 缓存的概念与配置

缓存用于存储频繁访问但不常变化的数据,以提高应用性能。ASP.NET Core提供多种缓存机制,如内存缓存(IMemoryCache)。在Startup.cs中通过AddMemoryCache方法注册服务,并在需要处通过依赖注入使用。

2. 代码示例与应用场景

以产品列表页面为例,产品数据若相对稳定,可缓存提高性能。

  • 配置缓存服务(在Startup.cs中)
public void ConfigureServices(IServiceCollection services)
{services.AddMemoryCache();// 其他服务配置...
}
  • 控制器中使用缓存
public class ProductController : Controller
{private readonly IMemoryCache _memoryCache;private readonly IProductRepository _productRepository;public ProductController(IMemoryCache memoryCache, IProductRepository productRepository){_memoryCache = memoryCache;_productRepository = productRepository;}public IActionResult Index(){if (!_memoryCache.TryGetValue("ProductList", out List<Product> products)){products = _productRepository.GetAllProducts();var cacheEntryOptions = new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromMinutes(10));_memoryCache.Set("ProductList", products, cacheEntryOptions);}return View(products);}
}

应用场景:适用于存储频繁访问但不常变化的数据,如网站配置信息、下拉菜单选项、常用字典数据等,以及计算成本高或查询耗时操作的结果。

五、会话(Session)

1. 会话的特点与工作原理

会话用于在用户多个请求间存储和共享数据。数据存储在服务器端,会话标识(通常通过Cookie)存于客户端识别用户会话。每个用户有独立会话数据,在整个用户会话期间有效。

2. 代码示例与应用场景

如购物车应用,可使用会话存储用户购物车商品信息。

  • 配置会话服务(在Startup.cs中)
public void ConfigureServices(IServiceCollection services)
{services.AddSession(options =>{options.IdleTimeout = TimeSpan.FromMinutes(30);options.Cookie.HttpOnly = true;options.Cookie.IsEssential = true;});// 其他服务配置...
}
  • 启用会话中间件(在Configure方法中)
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{// 其他中间件配置...app.UseSession();// 更多中间件配置...
}
  • 控制器中使用会话
public class CartController : Controller
{private readonly ISession _session;public CartController(ISession session){_session = session;}public IActionResult AddToCart(int productId){var cart = _session.GetObjectFromJson<List<int>>("Cart")?? new List<int>();cart.Add(productId);_session.SetObjectAsJson("Cart", cart);return RedirectToAction("Index");}public IActionResult Index(){var cart = _session.GetObjectFromJson<List<int>>("Cart");var productsInCart = _productRepository.GetProductsByIds(cart);return View(productsInCart);}
}

应用场景:常用于存储用户相关状态信息,如登录状态、购物车内容、用户偏好设置等,跨页面共享和维护的数据。

六、在控制器之间传递数据

1. 使用TempData在控制器之间传递数据

TempData可用于控制器间传递数据,尤其在重定向场景。例如,注册成功后将消息传递给另一个控制器显示。

  • 注册控制器
public class RegistrationController : Controller
{public IActionResult Register(RegistrationViewModel model){if (ModelState.IsValid){// 假设注册成功TempData["RegistrationSuccessMessage"] = "注册成功!";return RedirectToAction("Welcome", "WelcomeController");}return View(model);}
}
  • 欢迎控制器
public class WelcomeController : Controller
{public IActionResult Welcome(){var message = TempData["RegistrationSuccessMessage"];if (message!= null){ViewBag.Message = message;}return View();}
}

2. 通过路由参数传递数据

在重定向或链接到其他控制器操作时,可将数据作为路由参数传递。如订单完成后,将订单ID传递给订单详情控制器。

  • 订单控制器
public class OrderController : Controller
{public IActionResult CompleteOrder(int orderId){// 假设订单处理完成return RedirectToAction("Details", "OrderDetailsController", new { orderId = orderId });}
}
  • 订单详情控制器
public class OrderDetailsController : Controller
{public IActionResult Details(int orderId){var order = _orderService.GetOrderById(orderId);return View(order);}
}

3. 使用共享服务或单例模式传递数据

创建共享服务(如DataService)或使用单例模式可在控制器间共享数据。例如:

  • 定义共享服务
public class DataService
{private List<string> _dataList = new List<string>();public void AddData(string data){_dataList.Add(data);}public List<string> GetData(){return _dataList;}
}
  • 注册服务为单例(在Startup.cs中)
public void ConfigureServices(IServiceCollection services)
{services.AddSingleton<DataService>();// 其他服务配置...
}
  • 控制器使用共享服务
public class ControllerA : Controller
{private readonly DataService _dataService;public ControllerA(DataService dataService){_dataService = dataService;}public IActionResult AddData(string data){_dataService.AddData(data);return RedirectToAction("GetData", "ControllerB");}
}public class ControllerB : Controller
{private readonly DataService _dataService;public ControllerB(DataService dataService){_dataService = dataService;}public IActionResult GetData(){var dataList = _dataService.GetData();return View(dataList);}
}

通过以上多种方式,在ASP.NET Core MVC中可实现灵活的数据传递。在实际应用中,需根据数据性质、安全性、性能需求等因素综合选择合适方式,确保数据在控制器、视图及不同请求间有效传递和共享,构建出功能强大、性能优化的Web应用程序。

希望我这篇博文对你理解ASP.NET Core MVC中的数据传递有所帮助,如感兴趣请继续关注博客。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十八、【智能体】数据库:未来科技的大脑

在上一篇中我们讲到了 **变量 ** &#xff0c; 变量 的作用是保存用户个人信息&#xff0c;让 Bot记住用户的特征&#xff0c;使回复更加个性化。 上一篇内容为&#xff1a;https://blog.csdn.net/qq_40585384/article/details/143272599 但变量有一个缺点——存储的信息太单…

web文件包含include

php伪协议 在 PHP 中&#xff0c;伪协议&#xff08;Pseudo Protocols&#xff09; 也被称为 流包装器&#xff0c;这些伪协议以 php:// 开头&#xff0c;后面跟着一些参数&#xff0c;用于指定 要执行的操作 或 需要访问的资源。 伪协议表明这些协议并不是一个 真实的外部协议…

Diving into the STM32 HAL-----USART

如今&#xff0c;电子行业有许多串行通信协议和硬件接口可用。其中之一是通用同步/异步接收器/发射器接口&#xff0c;也简称为 USART。几乎每个微控制器都至少提供一个 UART 外设。几乎所有的 STM32 MCU 都提供至少两个 UART/USART 接口&#xff0c;但根据 MCU 封装支持的 I/O…

功能强大视频编辑软件 Movavi Video Editor Plus 2024 v24.2.0 中文特别版

Movavi Video Editor Plus中文修改版是一款功能强大的视频制作编辑软件&#xff0c;使用能够帮助用户快速从录制的素材中制作成一个精美的电影&#xff0c;支持进行视频剪辑&#xff0c;支持添加背影、音乐和各种音乐&#xff0c;软件使用简单&#xff0c;无需任何的经验和专业…

中国书画、

孙溟㠭浅析“古玺” “古玺”是秦以前印章的通称&#xff0c;远可追溯三代&#xff0c;兴盛于战国。古玺所用的文字是当时六国的篆书&#xff0c;也就是大篆&#xff0c;风格多种多样&#xff0c;变化不一&#xff0c;不容易认识。从文字形式上&#xff0c;可分阴文&#xff08…

WPF+MVVM案例实战(九)- 霓虹灯字效果控件封装实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、运行效果2、主菜单与界面实现1、主菜单2、霓虹灯字界面实现3、字体资源获取3、控件封装1.创建自定义控件2、依赖属性实现3、封装控件使用4、运行效果4、源代码获取1、运行效果 2、主菜单与界面实…

《JVM第6课》本地方法栈

文章目录 1 什么是本地方法1.1 本地方法的好处1.2 声明本地方法1.3 实现本地方法1. 生成头文件2. 编写C语言实现3. 编译C代码4. 运行Java程序 1.4 使用JNA1.5 总结 2 本地方法栈2.1 特点2.2 本地方法栈与Java虚拟机栈的区别2.3 本地方法栈的工作流程2.4 总结 无痛快速学习入门J…

Python酷库之旅-第三方库Pandas(183)

目录 一、用法精讲 846、pandas.api.types.is_number函数 846-1、语法 846-2、参数 846-3、功能 846-4、返回值 846-5、说明 846-6、用法 846-6-1、数据准备 846-6-2、代码示例 846-6-3、结果输出 847、pandas.api.types.is_re函数 847-1、语法 847-2、参数 847…

【SSM详细教程】-13-SpringMVC详解

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…

【WPF】用于图形绘制的三个重要类:Canvas 类,PathGeometry 类,Path 类

WPF中用于图形绘制的三个重要类&#xff1a;Canvas 类&#xff0c;PathGeometry 类&#xff0c;Path 类 Canvas 类PathGeometry 类Path 类各自异同 在WPF (Windows Presentation Foundation) 中&#xff0c;Canvas、PathGeometry 和 Path 是用于图形绘制的三个重要类。下面将分…

Harmony OS搭建广告展示页

有些app需要广告页&#xff0c;有的不需要&#xff0c;我们需要搞个配置。 1. 通过首选项配置存储我们的常用配置&#xff0c;比如是否需要广告页、广告页的路由地址、点击广告页跳转的链接以及广告页倒计时。 1.1 新建一个关于广告页的数据模型。 export class AdvertClass…

国内AI大模型学习平台

据不完全统计&#xff0c;目前&#xff0c;国内有几大AI大模型学习平台可供选择&#xff1a; 1.昇思大模型平台&#xff1a;这是一个集算法选型、创意分享、模型实验和大模型在线体验于一体的AI学习与实践社区。 2.魔搭社区&#xff1a;提供AI模型、数据集和应用的开发与探索平…

JVM(HotSpot):finally块的相关问题

文章目录 前言一、finally 中 return1、代码案例2、字节码 二、finally 中修改值1、代码案例2、字节码 三、总结 前言 try {}catch (Exception e){}finally {}如上代码&#xff0c;如果发生异常&#xff0c;我们在可以通过catch块捕获 捕获后&#xff0c;是打印报错信息还是怎么…

新建Flutter工程

1.使用Android studio新建New Flutter project&#xff1b; 2.最新版本兼容性配置 android-settings.gradle文件下&#xff1a; pluginManagement {//.......repositories {//阿里云镜像地址&#xff1a;maven { url https://maven.aliyun.com/repository/public/ }maven { …

设计模式4-工厂模式策略模式

目录 一 工厂模式 1.1 思想 1.2 案例 1.2.1 接口 1.2.2 实现类 1.2.3 工厂类 1.2.4 调用 二 策略模式 2.1 思想 2.2 案例 2.2.1 接口 2.2.2 实现类 2.2.3 策略类 2.2.4 调用 三 工厂模式策略模式 3.1 思想 3.2 案例 3.2.1 接口 3.2.2 实现类 3.2.3 定义F…

常见问题 | 数字签名如何保障电子商务交易安全?

如何解决电商交易中数据泄露、交易欺诈等问题&#xff1f; 数字签名是一种类似于电子“指纹”的安全技术&#xff0c;它在电子商务中扮演着至关重要的角色。随着电子商务的迅猛发展&#xff0c;网上交易的数量不断增加&#xff0c;确保交易的安全性和完整性成为了亟待解决的问题…

不适合的学习方法

文章目录 不适合的学习方法1. 纯粹死记硬背2. 过度依赖单一资料3. 线性学习4. 被动学习5. 一次性学习6. 忽视实践7. 缺乏目标导向8. 过度依赖技术9. 忽视个人学习风格10. 过于频繁的切换 结论 以下是关于不适合的学习方法的更详细描述&#xff0c;包括额外的内容和相关公式&…

HTML5 + CSS3 + JavaScript 编程语言学习教程

HTML5 CSS3 JavaScript 编程语言学习教程 欢迎来到这篇关于 HTML5、CSS3 和 JavaScript 的详细学习教程&#xff01;无论你是初学者还是有一定基础的开发者&#xff0c;这篇文章都将帮助你深入理解这三种技术的核心概念、语法和应用。 目录 HTML5 1.1 HTML5 简介1.2 HTML5 …

【安全性分析】正式安全分析与非正式安全分析

安全性分析-系列文章目录 第一章 【安全性分析】正式安全分析与非正式安全分析 第二章 【安全性分析】BAN逻辑 (BAN Logic) 文章目录 安全性分析-系列文章目录前言一、正式安全分析1. 理想化模型(如随机预言机模型)2. 标准模型(Standard Model)3. 形式化验证4. 数学证明二…

win11安装安卓apk原生应用,并设置网络代理

一、win11安装安卓apk原生应用&#xff0c;查看https://blog.csdn.net/qq_33704787/article/details/123658419https://blog.csdn.net/qq_33704787/article/details/123658419 主要是安装&#xff1a;Windows Subsystem for Android™ with Amazon Appstore 二、使用ABD工具设…