C# ViewBag、ViewData、TempData、Session-如何以及何时使用它们?
ViewData和ViewBag允许您访问视图中从控制器传递的任何数据 这两者之间的主要区别在于访问数据的方式。 在ViewBag中,您使用字符串作为键访问数据-ViewBag[“数字”] 在ViewData中,您正在使用属性-ViewData.Number访问数据 查看数据示例 控制器C# ViewBag、ViewData、TempData、Session-如何以及何时使用它们?,c#,asp.net-mvc,visual-studio-2010,C#,Asp.net Mvc,Visual Studio 2010,ViewData和ViewBag允许您访问视图中从控制器传递的任何数据 这两者之间的主要区别在于访问数据的方式。 在ViewBag中,您使用字符串作为键访问数据-ViewBag[“数字”] 在ViewData中,您正在使用属性-ViewData.Number访问数据 查看数据示例 控制器 var Numbers = new List<int> { 1, 2, 3 }; ViewData["numbers"] = Numbers; var Numbers =
var Numbers = new List<int> { 1, 2, 3 };
ViewData["numbers"] = Numbers;
var Numbers = new List<int> { 1, 2, 3 };
ViewBag.numbers = Numbers;
if (TempData["DateOfViewWasAccessed"] != null)
{
DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString());
}
只要用户会话处于活动状态,此信息将存储在会话中。
这可以在Web.config文件中更改:
<system.web>
<sessionState mode="InProc" timeout="30"/>
TempData与ViewData和ViewBag非常相似,但它只包含一个请求的数据
控制器
//您创建了一个方法来添加新客户端
TempData["ClientAdded"] = "Client has been added";
看法
控制器
var Numbers = new List<int> { 1, 2, 3 };
ViewData["numbers"] = Numbers;
var Numbers = new List<int> { 1, 2, 3 };
ViewBag.numbers = Numbers;
if (TempData["DateOfViewWasAccessed"] != null)
{
DateTime time = DateTime.Parse(TempData["DateOfViewWasAccessed"].ToString());
}
是一个非常短暂的实例,您应该只在当前和后续请求期间使用它!因为TempData是这样工作的,所以您需要确定下一个请求是什么,并且重定向到另一个视图是唯一可以保证这一点的时间。因此,使用TempData可靠工作的唯一场景是重定向时。这是因为重定向会终止当前请求(并将HTTP状态代码302对象发送到客户端),然后在服务器上创建一个新请求以服务重定向视图。回顾上一个HomeController代码示例,意味着TempData对象可能会产生与预期不同的结果,因为无法保证下一个请求来源。例如,下一个请求可能来自完全不同的机器和浏览器实例
视图数据
ViewData是一个字典对象,您可以将数据放入其中,然后视图可以使用它。ViewData是ViewDataDictionary类的派生,因此您可以通过熟悉的“键/值”语法进行访问
视袋
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();
}
}
ViewBag、ViewData、TempData、Session-如何以及何时使用它们
视袋
避免它。尽可能使用视图模型
原因是,当您使用动态属性时,不会出现编译错误。由于意外或故意更改属性名称,然后忘记更新所有用法,这真的很容易
如果使用ViewModel,则不会出现此问题。视图模型还将调整MVC中“M”(即业务实体)的责任从控制器和视图转移到视图模型,因此您可以获得责任明确的更清晰的代码
行动
public ActionResult Index()
{
ViewBag.SomeProperty = "Hello";
return View();
}
public ActionResult Index()
{
ViewData["SomeProperty"] = "Hello";
return View();
}
视图(razor语法)
视图数据
承认吧。尽可能使用视图模型。与ViewBag的原因相同
行动
public ActionResult Index()
{
ViewBag.SomeProperty = "Hello";
return View();
}
public ActionResult Index()
{
ViewData["SomeProperty"] = "Hello";
return View();
}
视图(razor语法):
@ViewData["SomeProperty"]
温度数据
无论中间是否有一个或多个HTTP请求,存储在TempData
中的所有内容都将保留在TempData中,直到您读取它为止
行动
public ActionResult Index()
{
TempData["SomeName"] = "Hello";
return RedirectToAction("Details");
}
public ActionResult Details()
{
var someName = TempData["SomeName"];
}
}
在上面的对话中,每个人都不会感到困惑。如果您查看我上面的代码,tempdata类似于viewdata概念,但它也可以重定向其他视图。这是第一点
第二点:
他们中很少有人说它在读之前保持价值,也很少有人问它是否会在读的时候保持价值?不是这样。
实际上,在页面呈现之前,您可以在一个后打包中读取代码中的任意时间。一旦发生页面渲染,如果再次执行后打包(请求)意味着,tempdata值将变为NULL
即使您请求了这么多时间,但tempdata值仍然有效-->在这种情况下,您的请求数量不应读取temp数据值。简单来说:
ViewBag是一个动态(动态:能够由同一对象上的不同程序分配多个值)对象,用于将数据从控制器发送到视图。当我们从控制器的动作跳到某个视图时,可以使用它。但是,我们在视图(在viewbag对象中)中获得的值不能在其他视图/控制器/js页面等中进一步复制。这意味着:控制器->视图(可能)。现在无法将此值发送到下一个视图/控制器。意思是Controller->View->View/Controller/somejs文件(不可能),要携带这个值,您需要定义一些其他变量并将viewbag值存储到其中,然后将其作为参数发送
Tempdata与viewbag非常不同。这与风景毫无关系。当我们将数据从一个动作(方法)发送到同一控制器中的另一个动作时,会使用它。这就是我们在将tempdata值从一个动作发送到另一个动作时使用RedirectToAction的原因。从控制器发送到veiw时,tempdata的值不会保留(因为它不打算这样做)
ViewData与viewbag相似,但它是一个字典对象。ViewData可能需要类型转换,而viewbag可能不需要。这取决于用户可能想要使用哪一个。谢谢您提供更多信息!这对大多数人都很有帮助。这里有问题吗?或者这是一篇博客文章?回答你自己的问题是可以的,但它应该作为一个答案,而不是问题的一部分。更重要的是,这篇文章之前已经被介绍过了,我会记住这一点,并为此感到抱歉。我试着给出更多的例子,也许一些更有经验的开发人员也会分享他们的经验。“当你需要在几个请求上保存信息时”——我认为只有在读取TempData之前TempData才是好的。我认为这里使用几个请求有点误导。我的意思是,它会一直保存在临时数据中,直到您阅读它,不管是两个请求还是10个请求。谢谢,我在我的应用程序中经常使用TempData,但我认为它只会停留在一个请求中,除非您阅读它。所以
@ViewData["SomeProperty"]
public ActionResult Index()
{
TempData["SomeName"] = "Hello";
return RedirectToAction("Details");
}
public ActionResult Details()
{
var someName = TempData["SomeName"];
}
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();
}
}