ASP.NET MVC之從控制器傳遞數據到視圖四種方式(一)


前言

本系列開始着手講述ASP.NET MVC,也算是自己對基礎的回顧以及進一步深入學習,保證每天發表一篇該系列文章,關於基本知識則不再敘述,園子有關文章不勝枚舉,這一系列若有敘述不當或錯誤之處,歡迎指出以及批評。

前奏

新建基本項目在Models文件夾下定義如下類:

    public class Person
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public string BlogAddress { get; set; }

        public string Description { get; set; }
    }

我們在控制器的Action方法中實例化此類:

            var p = new Person()
            {
                Id = 98,
                Name = "xpy0928",
                BlogAddress = "http://www.cnblogs.com/CreateMyself",
                Description = "出生非貧即貴,你我無能為力,后天若不加以努力趕之超之,又能怪誰呢!自己都靠不住不靠譜,又能靠誰呢!"
            };

方式1 (ViewData)

我們利用ViewData以鍵值對的形式來存儲上述實例化的對象,如下:

 ViewData["Person"] = p;

在視圖中我們從ViewData中獲取存儲的值並轉換成對象,如下:

@using ASP.NET_MVC_1.Models;

@{
    var p = (Person)ViewData["Person"];
}

接着我們獲取對象中的值:

<h1>Person</h1>
<h3>@p.Id</h3>
<h3>@p.Name</h3>
<h3>@p.BlogAddress</h3>
<h3>@p.Description</h3>

我們來看看是否獲取到該對象的值,如下:

 方式2(ViewBag)

 將控制器Action方法以ViewBag創建動態表達式來進行,如下:

 ViewBag.Person = p;

在視圖中,我們進行如下修改:

@using ASP.NET_MVC_1.Models;

@{
    var p = ViewBag.Person as Person;
}

獲取對象值同上,我們繼續看看是否如我們所預想:

方式3(Model) 

我們通過控制器中返回的View方法進行傳遞該對象,如下:

            var p = new Person()
            {
                Id = 98,
                Name = "xpy0928",
                BlogAddress = "http://www.cnblogs.com/CreateMyself",
                Description = "出生非貧即貴,你我無能為力,后天若不加以努力趕之超之,又能怪誰呢!自己都靠不住不靠譜,又能靠誰呢!"
            };
            return View(p);

此時視圖中,我們將需要得到該強類型對象:

@using ASP.NET_MVC_1.Models;

@model Person;

而獲取對象的值則通過Model來獲取,如下:

<h1>Person</h1>
<h3>@Model.Id</h3>
<h3>@Model.Name</h3>
<h3>@Model.BlogAddress</h3>
<h3>@Model.Description</h3>

毫無疑問結果依然如此:

方式4(TempData) 

從字面意思來理解我們會誤認為是臨時對象,好像就使用一次就不會再用了,確實是這樣嗎?很顯然不是這樣,當然其生命周期確實很短。該對象是將數據從一個控制器的方法傳遞到另外一個方法上。什么意思呢?我們想象這樣一個場景:當我們在控制器的Info方法上添加一個Person的信息后,我們跳轉到另外一個方法TempDataObject上來顯示該對象已經成功被創建。

下面我們來演示這種場景:

        public ActionResult Info()
        {
            var p = new Person()
            {
                Id = 98,
                Name = "xpy0928",
                BlogAddress = "http://www.cnblogs.com/CreateMyself",
                Description = "出生非貧即貴,你我無能為力,后天若不加以努力趕之超之,又能怪誰呢!自己都靠不住不靠譜,又能靠誰呢!"
            };
            //TODO 添加Person到數據庫中
            TempData["info"] = "提示:已經成功添加一條數據到數據庫中";
            return RedirectToAction("TempDataObject");
        }

創建一個TempData方法,獲取上面傳遞過來的值,如下:

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

在方法對應的視圖獲取傳遞過來的值:

<h1>@TempData["info"]</h1>

我們通過訪問Info,觀察當跳轉過來到該方法時后渲染視圖是否能夠獲取到該值:

當然在上述過程中這是利用將一個Action中的數據通過TempData傳遞到另外一個Action中,但是我們需注意,這是利用跳轉到TempDataObject才會正確顯示數據,如果我們直接刷新頁面將會出現System.NullReferenceException。

結語 

關於其區別就不再敘述,園子中已有大量的總結,今天就到此為止。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM