1. 程式人生 > >ASP.NET MVC之從控制器傳遞數據到視圖方式

ASP.NET MVC之從控制器傳遞數據到視圖方式

bsp col 動態 wid sel pre 書寫 進行 edi

1、為了演示,先定義一個類

新建基本項目在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;  //引用模型模塊,視圖中HTML中使用Razor書寫格式 @+C#代碼

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

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

<h1>Person</h1>
<h3>@p.Id</h3>   //Razor視圖中C#代碼前加@
<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)

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

此時視圖中,我們將需要得到該強類型對象: 而獲取對象的值則通過Model來獲取,如下:

@using ASP.NET_MVC_1.Models;

@model Person;

<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。

ASP.NET MVC之從控制器傳遞數據到視圖方式