2013-03-04 90 views
10

ViewData和ViewBag允许您访问从控制器传递的视图中的任何数据。ViewBag,ViewData,TempData,Session - 如何以及何时使用它们?

这两者之间的主要区别在于您访问数据的方式。 在ViewBag中,您使用字符串作为键访问数据 - ViewBag [“numbers”] 在ViewData中,您正在使用属性 - ViewData.numbers访问数据。

的ViewData例如

CONTROLLER

var Numbers = new List<int> { 1, 2, 3 }; 

      ViewData["numbers"] = Numbers; 

VIEW

<ul> 
@foreach (var number in (List<int>)ViewData["numbers"]) 
{ 
    <li>@number</li> 
} 

</ul> 

ViewBag例如

CONTROLLER

var Numbers = new List<int> { 1, 2, 3 }; 

     ViewBag.numbers = Numbers; 

VIEW

<ul> 

@foreach (var number in ViewBag.numbers) 

{ 
<li>@number</li> 
} 

</ul> 

会议是另一种非常有用的对象,将持有的任何信息。

例如,当用户登录到系统时,您想保持其授权级别。

// GetUserAuthorizationLevel - some method that returns int value for user authorization level. 

Session["AuthorizationLevel"] = GetUserAuthorizationLevel(userID); 

只要用户会话处于活动状态,此信息将存储在会话中。所以后来

<system.web> 
    <sessionState mode="InProc" timeout="30"/> 

在控制器的动作里面: 这可以在Web.config文件进行更改

public ActionResult LevelAccess() 
    { 
     if (Session["AuthorizationLevel"].Equals(1)) 
     { 
      return View("Level1"); 
     } 

     if (Session["AuthorizationLevel"].Equals(2)) 
     { 
      return View("Level2"); 
     } 

     return View("AccessDenied"); 
    } 

TempData的非常相似的ViewData和ViewBag但它包含的数据只为一个请求。

CONTROLLER

//您创建了添加新客户端的方法。

TempData["ClientAdded"] = "Client has been added"; 

VIEW

@if (TempData["ClientAdded"] != null) 
{ 
    <h3>@TempData["ClientAdded"] </h3> 
} 

TempData的,当你想通过从视图到控制器的一些信息是有用的。例如,您希望在查看请求时保留时间。

VIEW

@{ 
TempData["DateOfViewWasAccessed"] = DateTime.Now; 
} 

控制器

if (TempData["DateOfViewWasAccessed"] != null) 
    { 
    DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString()); 
    } 
+0

感谢您的更多信息!这对大多数人应该是非常有用的。 – 2013-03-04 14:49:58

+0

这里有个问题,还是这是一篇博文?回答你自己的问题很好,但它应该作为答案,而不是问题的一部分。更重要的是,这种材料已经被覆盖过,比如[ViewData,ViewBag,Session,TempData的正确时间是什么](http://stackoverflow.com/questions/12676924/what-is-the-right-time -for-viewdata-viewbag-session-tempdata) – 2013-03-04 15:26:27

+0

我会记住,对于未来和抱歉。我试图给出更多的例子,也许一些更有经验的开发人员也分享他们的经验。 – 2013-03-04 16:24:52

回答

11

ViewBag,ViewData的,TempData的,会话 - 如何以及何时使用它们?

ViewBag

避免它。尽可能使用视图模型。

原因是,当您使用动态属性时,您将不会收到编译错误。不小心或故意改变属性名称非常简单,然后忘记更新所有用法。

如果使用ViewModel,则不会出现该问题。视图模型还将MVC中的“M”(即业务实体)从控制器和视图调整为ViewModel的责任,因此您可以获得清晰的代码和清晰的职责。

行动

public ActionResult Index() 
{ 
    ViewBag.SomeProperty = "Hello"; 
    return View(); 
} 

视图(剃刀语法)

@ViewBag.SomeProperty 

的ViewData

Avoit它。尽可能使用视图模型。与ViewBag相同的原因。

行动

public ActionResult Index() 
{ 
    ViewData["SomeProperty"] = "Hello"; 
    return View(); 
} 

视图(剃刀语法):

@ViewData["SomeProperty"] 

温度数据,你在TempData存储将留在TempData的,直到你读它

一切,不管中间是否有一个或多个HTTP请求。

操作

public ActionResult Index() 
{ 
    TempData["SomeName"] = "Hello"; 
    return RedirectToAction("Details"); 
} 


public ActionResult Details() 
{ 
    var someName = TempData["SomeName"]; 
} 
+1

“当你需要在多个请求中保存信息时” - 我认为TempData只有在读取之前才是好的。我认为在这里使用几个要求是有点误导。 – Tommy 2013-03-04 15:02:29

+1

我的意思是,它保持在临时数据,直到你读它,不管它是两个请求还是两个请求之间。但我明白你的意思,并会详细说明。 – jgauffin 2013-03-04 15:17:50

+0

+1 ViewBag - 避免它 – 2013-03-04 15:27:40

3

TempData

意味着是一个非常短暂的情况下,你应该只在当前使用它,随后的请求只!由于TempData以这种方式工作,因此您需要确切知道下一个请求会是什么,并且重定向到另一个视图是唯一可以保证这一点的时间。因此,使用TempData可靠工作的唯一场景就是在重定向时。这是因为重定向会终止当前请求(并将HTTP状态码302对象移动到客户端),然后在服务器上创建一个新的请求以服务重定向的视图。回顾以前的HomeController代码示例,意味着TempData对象可能产生与预期不同的结果,因为下一个请求源不能得到保证。例如,下一个请求可以源自完全不同的机器和浏览器实例。

的ViewData

ViewData的是,你把数据放到,然后成为可供查看的字典对象。 ViewData是ViewDataDictionary类的衍生物,因此您可以通过熟悉的“键/值”语法进行访问。

ViewBag

的ViewBag对象是各地的ViewData对象允许您创建的ViewBag动态特性的包装。

public class HomeController : Controller 
{ 
    // ViewBag & ViewData sample 
    public ActionResult Index() 
    { 
     var featuredProduct = new Product 
     { 
      Name = "Special Cupcake Assortment!", 
      Description = "Delectable vanilla and chocolate cupcakes", 
      CreationDate = DateTime.Today, 
      ExpirationDate = DateTime.Today.AddDays(7), 
      ImageName = "cupcakes.jpg", 
      Price = 5.99M, 
      QtyOnHand = 12 
     }; 

     ViewData["FeaturedProduct"] = featuredProduct; 
     ViewBag.Product = featuredProduct; 
     TempData["FeaturedProduct"] = featuredProduct; 

     return View(); 
    } 
} 
0
namespace TempData.Controllers 
{ 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     TempData["hello"] = "test"; // still alive 
     return RedirectToAction("About"); 
    } 

    public ActionResult About() 
    { 
     //ViewBag.Message = "Your application description page."; 
     var sonename = TempData["hello"]; // still alive (second time) 
     return RedirectToAction("Contact"); 
    } 


    public ActionResult Contact() 
    { 
     var scondtime = TempData["hello"]; // still alive(third time) 
     return View(); 
    } 
    public ActionResult afterpagerender() 
    { 
     var scondtime = TempData["hello"];//now temp data value becomes null 

     return View(); 
    } 
} 

}

在上面的对话,对大家有点迷惑。如果你看看我的上面的代码,tempdata就像viewdata的概念,但它也可以重定向其他视图。这是第一点。

第二点: 他们中的几个人说它保持价值,直到阅读,他们中很少人要求它只读时间?并非如此。实际上,在页面呈现之前,您可以在一个邮包中读取代码中的任意时间。一旦页面呈现发生,如果您再次执行postpack(请求),则表示tempdata值为NULL。即使你要求这么多时间,但tempdata值仍然存在 - >这种情况下,你的请求数不应该读取临时数据值。

相关问题