變數資料的存放位置

 

在資料的存放上,我們都知道依設計目的的不同,

資料可以存放在區域變數、全域變數,如果要永久存放則可以配合資料庫,

但在開發Web程式與桌面程式所要考慮的點是不一樣的,

同一個時間點,開發Web程式需要考慮多人正在操作,

反而桌面程式只需考慮一人。以下列出開發Web程式時,資料存放的方式。

 

一、配合資料庫

資料放在資料庫是一個設計通解,但建構複雜,如果設計目地只是暫存,

那設計成本就有點高。

 

二、使用靜態變數

例如要做一個簡單的來訪人數計數器

後端為

using System.Web.Mvc;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public static int count = 0;

        public ActionResult Index()
        {
            count++;
            return View(count);
        }
    }
}

前端為

<p>來訪人數:@Model</p>

被宣告static的count變數,就是暫存的靜態全域變數,

如果server端程式沒有被重新啟動,則每一位連接進來的使用者都會做計數動作。

 

但如果把static宣告拿掉時則會如何?

使用者每連接次到server端程式,將被視為new起一個process,

每一個process都會跑過一次Controller,由於count不是「static」,

所以使用者每連接一次,count變數就會被重設為 0 一次,

自然而然計數功能就失效了。

 

三、使用session或cookies

以session為例,如果暫存資料是不需要放在server端集中保管的話,

則可以利用session來將資料交由使用者各自保管以減輕server負擔。

 

後端

using System.Web.Mvc;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            Session["login"] = "";
            return View();
        }

        public ActionResult Login()
        {
            Session["login"] = Session.SessionID + " 已登入";

            return Redirect("Contact");
        }

        public ActionResult Contact()
        {
            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    }
}

 

前瑞

Index.cshtml

@Html.ActionLink("登入", "Login")

 

Contact.cshtml

@if ((string)Session["login"] == "")
{
    @Html.ActionLink("登入", "Login")
}
else
{
    <p>@((string)Session["login"])</p>
}

 

四、使用TempData

MVC裡的TempData也只是session技術的延伸,

請直接參考Model Binding-ViewBag ViewData ViewData.Mode TempData