页面传值的多种方式 详细说明及代码详细示例 和优缺点

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

  • 优点:语义清晰。
  • 缺点:需配置路由。
  • 适用场景:资源标识。

总结表格

传值方式适用平台安全性易用性性能影响
QueryStringWeb
SessionWeb
CookieWeb
TempDataWeb
ViewBag/ViewDataWeb
ModelWeb
构造函数WinForms
公共属性WinForms
委托事件WinForms
静态类WinForms
Tag 属性WinForms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路飞VS草帽

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值