在 C# 的开发中,尤其是 WinForms 和 ASP.NET Web Forms / MVC / Core 中,页面传值是非常常见的需求。以下是 C# 页面传值的多种方式 的详细说明、代码示例和优缺点分析。
一、WinForms 页面传值方式
1. 构造函数传值
- 描述:通过窗体构造函数传递参数。
- 代码示例:
csharp
// Form2.cs public partial class Form2 : Form { private string _message; public Form2(string message) { InitializeComponent(); _message = message; } private void Form2_Load(object sender, EventArgs e) { MessageBox.Show(_message); } } // 调用方 Form2 form2 = new Form2("Hello from Form1"); form2.Show(); - 优点:简单直观。
- 缺点:只能在创建时传值。
- 适用场景:打开新窗口时传初始值。
2. 公共属性传值
- 描述:通过定义公共属性传值。
- 代码示例:
csharp
public partial class Form2 : Form { public string Message { get; set; } private void Form2_Load(object sender, EventArgs e) { MessageBox.Show(Message); } } // 调用方 Form2 form2 = new Form2(); form2.Message = "Hello from Form1"; form2.Show(); - 优点:灵活,可多次赋值。
- 缺点:需注意线程安全。
- 适用场景:需要多次修改数据。
3. 委托/事件传值(回调)
- 描述:子窗体向父窗体传值。
- 代码示例:
csharp
// 父窗体 public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.DataSent += (data) => { MessageBox.Show("Received: " + data); }; form2.Show(); } } // 子窗体 public partial class Form2 : Form { public delegate void DataHandler(string data); public event DataHandler DataSent; private void buttonSend_Click(object sender, EventArgs e) { DataSent?.Invoke("Data from Form2"); } } - 优点:支持双向通信。
- 缺点:逻辑复杂时难以维护。
- 适用场景:父子窗体间交互。
4. 静态类传值
- 描述:通过静态类共享数据。
- 代码示例:
csharp
public static class GlobalData { public static string SharedData { get; set; } } // 设置值 GlobalData.SharedData = "Shared Value"; // 获取值 string value = GlobalData.SharedData; - 优点:全局访问方便。
- 缺点:线程不安全,生命周期长。
- 适用场景:临时全局变量。
5. 使用 Tag 属性传值
- 描述:利用控件或窗体的
Tag属性存储任意对象。 - 代码示例:
csharp
Form2 form2 = new Form2(); form2.Tag = new { Name = "John", Age = 30 }; form2.Show(); // 在 Form2 中获取 var data = (dynamic)Tag; MessageBox.Show(data.Name); - 优点:快速存取。
- 缺点:类型不安全。
- 适用场景:临时数据传递。
二、ASP.NET Web Forms 页面传值方式
6. QueryString 传值
- 描述:通过 URL 查询字符串传值。
- 代码示例:
csharp
// 发送方 Response.Redirect("TargetPage.aspx?name=John&age=30"); // 接收方 string name = Request.QueryString["name"]; string age = Request.QueryString["age"]; - 优点:简单易用。
- 缺点:暴露数据,长度有限。
- 适用场景:GET 请求传参。
7. Session 传值
- 描述:使用会话状态保存用户数据。
- 代码示例:
csharp
// 存储 Session["username"] = "John"; // 读取 string username = Session["username"] as string; - 优点:跨页面共享,适合登录信息。
- 缺点:占用服务器内存,性能差。
- 适用场景:用户登录状态管理。
8. Cookie 传值
- 描述:客户端存储数据。
- 代码示例:
csharp
HttpCookie cookie = new HttpCookie("user"); cookie.Value = "John"; cookie.Expires = DateTime.Now.AddDays(1); Response.Cookies.Add(cookie); // 读取 HttpCookie userCookie = Request.Cookies["user"]; if (userCookie != null) { string name = userCookie.Value; } - 优点:持久化,自动随请求发送。
- 缺点:大小限制(4KB),安全性低。
- 适用场景:记住用户名、偏好设置。
9. Server.Transfer 传值
- 描述:服务器端跳转并保留原始请求。
- 代码示例:
csharp
Context.Items["data"] = "SomeValue"; Server.Transfer("TargetPage.aspx"); // 目标页 string data = Context.Items["data"] as string; - 优点:URL 不变,效率高。
- 缺点:仅限同应用内使用。
- 适用场景:内部页面跳转。
10. ViewState 传值
- 描述:页面级状态保持。
- 代码示例:
csharp
ViewState["counter"] = 1; int counter = (int)ViewState["counter"]; - 优点:页面回发时保留数据。
- 缺点:只适用于当前页面。
- 适用场景:页面控件状态保存。
三、ASP.NET MVC 页面传值方式
11. ViewBag 传值
- 描述:动态对象,用于视图传值。
- 代码示例:
csharp
// Controller ViewBag.Message = "Hello from controller"; // View <h1>@ViewBag.Message</h1> - 优点:语法简洁。
- 缺点:无编译检查。
- 适用场景:视图渲染传参。
12. ViewData 传值
- 描述:字典形式传值。
- 代码示例:
csharp
ViewData["Title"] = "Home Page"; - 优点:强类型支持。
- 缺点:需强制转换。
- 适用场景:视图传值。
13. TempData 传值
- 描述:跨请求传值(基于 Session)。
- 代码示例:
csharp
TempData["notice"] = "Login successful!"; return RedirectToAction("Index"); // Index action ViewBag.Notice = TempData["notice"]; - 优点:一次有效,防止重复显示。
- 缺点:依赖 Session。
- 适用场景:重定向后提示消息。
14. Model 传值
- 描述:强类型模型传值。
- 代码示例:
csharp
public class UserViewModel { public string Name { get; set; } public int Age { get; set; } } // Controller var model = new UserViewModel { Name = "John", Age = 30 }; return View(model); // View @model MyNamespace.UserViewModel <p>@Model.Name</p> - 优点:类型安全,结构清晰。
- 缺点:需定义模型。
- 适用场景:复杂数据展示。
15. RouteData 传值
- 描述:通过路由参数传值。
- 代码示例:
csharp
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); // Controller public ActionResult Details(int id) { return View(id); } - 优点:语义清晰。
- 缺点:需配置路由。
- 适用场景:资源标识。
总结表格
| 传值方式 | 适用平台 | 安全性 | 易用性 | 性能影响 |
|---|---|---|---|---|
| QueryString | Web | 低 | 高 | 无 |
| Session | Web | 中 | 中 | 有 |
| Cookie | Web | 中 | 高 | 无 |
| TempData | Web | 中 | 中 | 有 |
| ViewBag/ViewData | Web | 中 | 高 | 无 |
| Model | Web | 高 | 中 | 无 |
| 构造函数 | WinForms | 高 | 高 | 无 |
| 公共属性 | WinForms | 高 | 高 | 无 |
| 委托事件 | WinForms | 高 | 中 | 无 |
| 静态类 | WinForms | 中 | 高 | 有 |
| Tag 属性 | WinForms | 中 | 高 | 无 |
1907

被折叠的 条评论
为什么被折叠?



