首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 臨時資料儲存實作:PhoneApplicationService.State 應用指南

     編輯:ASP.NET 基礎

前言

在 Windows Phone / Silverlight 應用程式中,頁面導航時如何保存暫時性資料(如使用者輸入一半的表單內容)是常見需求。PhoneApplicationService.State 字典提供應用程式層級的暫存機制,在頁面卸載時保存、載入時還原,本文詳細說明實作模式。

一、核心機制說明

  • 儲存位置:記憶體(應用程式進程存活期間)
  • 生命週期:應用程式被墳墓/重新啟動時保留;應用程式關閉則清除
  • 適用場景:頁面間導航傳遞暫時資料、表單輸入保存、暫存計算結果
  • 不適用:長期持久化資料(請用 IsolatedStorage/資料庫)

二、標準實作模式

頁面類別完整程式碼:

public partial class MainPage : PhoneApplicationPage
{
    // 取得應用程式服務實例
    PhoneApplicationService phoneAppService = PhoneApplicationService.Current;

    public MainPage()
    {
        InitializeComponent();
    }

    // 頁面導航離開時:保存狀態
    protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        // 將文字方塊內容存入 State 字典
        phoneAppService.State["myValue"] = textBox1.Text;
        
        base.OnNavigatedFrom(e);
    }

    // 頁面導航進入時:還原狀態
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        object savedValue;
        
        // 安全檢查:Key 是否存在 + TryGetValue 雙重保險
        if (phoneAppService.State.ContainsKey("myValue"))
        {
            if (phoneAppService.State.TryGetValue("myValue", out savedValue))
            {
                textBox1.Text = savedValue?.ToString() ?? "";
            }
        }
        
        base.OnNavigatedTo(e);
    }
}

三、關鍵 API 說明

方法/屬性用途備註
State["key"] = value儲存/更新值值必須可序列化
State.ContainsKey("key")檢查鍵是否存在避免 KeyNotFoundException
State.TryGetValue("key", out val)嘗試取值不拋出例外,回傳 bool 表示成功
State.Remove("key")移除指定鍵釋放記憶體
State.Clear()清空所有暫存應用程式重置時使用

四、進階應用模式

1. 封裝為擴充方法簡化呼叫

public static class StateExtensions
{
    public static T GetValue<T>(this IDictionary state, string key, T defaultValue = default(T))
    {
        if (state.TryGetValue(key, out object value) && value is T typed)
            return typed;
        return defaultValue;
    }

    public static void SetValue<T>(this IDictionary state, string key, T value)
    {
        state[key] = value;
    }
}

// 使用範例
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
    PhoneApplicationService.Current.State.SetValue("myValue", textBox1.Text);
    base.OnNavigatedFrom(e);
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    textBox1.Text = PhoneApplicationService.Current.State.GetValue("myValue", "");
    base.OnNavigatedTo(e);
}

2. 複雜物件儲存(需標記 Serializable)

[Serializable]
public class FormState
{
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime LastModified { get; set; }
    public List Tags { get; set; }
}

// 儲存
var form = new FormState { Name = "張三", Age = 25, LastModified = DateTime.Now, Tags = new List { "A", "B" } };
PhoneApplicationService.Current.State["FormData"] = form;

// 還原
if (PhoneApplicationService.Current.State.TryGetValue("FormData", out object obj) && obj is FormState restored)
{
    textBoxName.Text = restored.Name;
    textBoxAge.Text = restored.Age.ToString();
}

五、State vs 其他儲存機制比較

機制持久性容量適用場景
PhoneApplicationService.State應用程式存活期間記憶體限制(較小)頁面導航暫存、表單草稿
IsolatedStorageSettings永久(直到手動刪除)較大使用者設定、偏好、Token
IsolatedStorageFile永久配額限制檔案、資料庫、大量資料
資料庫永久無上限結構化業務資料

六、注意事項與最佳實務

  • 值必須可序列化:自訂類別需標記 [Serializable] 或實作 ISerializable
  • 避免存放大型物件:State 佔用記憶體,大量資料請用 IsolatedStorage
  • Key 命名規範:建議使用 "PageName_PropertyName" 格式避免衝突
  • 異步處理:儲存/讀取屬同步操作,耗時操作勿放在 OnNavigatedFrom/To 中
  • 測試墳墓情境:Visual Studio 偵錯工具列 →「墳墓」按鈕模擬應用程式被作業系統終止

結語

PhoneApplicationService.State 是 Windows Phone / Silverlight 應用程式頁面間暫時資料傳遞的標準機制。掌握 OnNavigatedFrom 存儲與 OnNavigatedTo 還原的標準模式,搭配 TryGetValue 安全取值與擴充方法封裝,能讓頁面導航體驗更流暢、資料不遺失。記住:它是「暫存」而非「持久化」,重要資料仍需落地到隔離儲存或資料庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved