Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ViewBag、ViewData、TempData、Session-如何以及何时使用它们?_C#_Asp.net Mvc_Visual Studio 2010 - Fatal编程技术网

C# ViewBag、ViewData、TempData、Session-如何以及何时使用它们?

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 =

ViewData和ViewBag允许您访问视图中从控制器传递的任何数据

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

查看数据示例

控制器

 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();
    }
}