当前位置:  开发笔记 > 编程语言 > 正文

ViewBag,ViewData和TempData

如何解决《ViewBag,ViewData和TempData》经验,为你挑选了3个好方法。

任何机构都可以解释,何时使用

    TempData的

    ViewBag

    ViewData的

我有一个要求,我需要在控制器中设置一个值,控制器将重定向到控制器二,控制器二将呈现视图.

我试图使用ViewBag,当我到达Controller Two时,值会丢失.

我可以知道何时使用和优缺点?

谢谢



1> Darin Dimitr..:

1)的TempData

允许您存储为重定向而存活的数据.在内部,它使用Session作为后备存储,在重定向之后,数据被自动驱逐.模式如下:

public ActionResult Foo()
{
    // store something into the tempdata that will be available during a single redirect
    TempData["foo"] = "bar";

    // you should always redirect if you store something into TempData to
    // a controller action that will consume this data
    return RedirectToAction("bar");
}

public ActionResult Bar()
{
    var foo = TempData["foo"];
    ...
}

2)ViewBag,ViewData

允许您将数据存储在将在相应视图中使用的控制器操作中.这假定操作返回视图但不重定向.仅在当前请求期间生活.

模式如下:

public ActionResult Foo()
{
    ViewBag.Foo = "bar";
    return View();
}

并在视图中:

@ViewBag.Foo

或者使用ViewData:

public ActionResult Foo()
{
    ViewData["Foo"] = "bar";
    return View();
}

并在视图中:

@ViewData["Foo"]

ViewBag它只是一个动态包装器ViewData,仅存在于ASP.NET MVC 3中.

话虽这么说,但这两种结构都不应该被使用.您应该使用视图模型和强类型视图.所以正确的模式如下:

查看型号:

public class MyViewModel
{
    public string Foo { get; set; }
}

行动:

public Action Foo()
{
    var model = new MyViewModel { Foo = "bar" };
    return View(model);
}

强类型视图:

@model MyViewModel
@Model.Foo

在简要介绍之后,让我们回答你的问题:

我的要求是我想在控制器1中设置一个值,该控制器将重定向到ControllerTwo,而Controller2将呈现视图.

public class OneController: Controller
{
    public ActionResult Index()
    {
        TempData["foo"] = "bar";
        return RedirectToAction("index", "two");
    }
}

public class TwoController: Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Foo = TempData["foo"] as string
        };
        return View(model);
    }
}

和相应的视图(~/Views/Two/Index.cshtml):

@model MyViewModel
@Html.DisplayFor(x => x.Foo)

使用TempData也有一些缺点:如果用户在目标页面上点击F5,数据将会丢失.

我个人也不使用TempData.这是因为在内部它使用Session我在我的应用程序中禁用会话.我更喜欢一种更加RESTful的方式来实现这一目标.这是:在第一个执行重定向的控制器操作中,将对象存储在数据存储中,并在重定向时使用生成的唯一ID.然后在目标操作上使用此id来获取最初存储的对象:

public class OneController: Controller
{
    public ActionResult Index()
    {
        var id = Repository.SaveData("foo");
        return RedirectToAction("index", "two", new { id = id });
    }
}

public class TwoController: Controller
{
    public ActionResult Index(string id)
    {
        var model = new MyViewModel
        {
            Foo = Repository.GetData(id)
        };
        return View(model);
    }
}

视图保持不变.


很好的答案,但我不同意教条的说法"这两种结构都不应该被使用".我找到了ViewBag的几个合法用法.例如,我在我的所有视图中设置了一个`ViewBag.Title`属性,该属性在我的`_Layout.cshtml`基本视图文件中使用.我使用它的另一种情况是向用户提供信息消息(例如"产品保存成功!").我在`Layout.cshtml`中放置了一些通用标记来呈现消息(如果提供),这允许我在任何Action中设置`ViewBag.Message`.在任何一种情况下使用ViewModel属性都有太多缺点.
我们这里有精英.Darin,Jesse特别提到了一个这样的例子.仅仅因为总有其他做事方式并不会自动否定它们的用处.
我不得不同意Jesse,虽然这是一个很好的描述,公然声明没有充分理由使用ViewBag是一个意见问题,不是事实.过度使用ViewBag当然是一种不好的做法,一些开发人员陷入了这个陷阱,但是使用它是一种强大的资源.
@Darin,我非常感谢你的出色工作.
@DarinDimitrov:我现在有一个场景,我需要在属性方法中将一些信息传递给视图.使用filterContext.Controller.ViewData比尝试将其传递给强类型视图要容易得多.那说,谢谢你的解释,这非常有用.

2> Abdur Rahman..:

ASP.NET MVC为我们提供了三个选项ViewData,ViewBag和TempData,用于将数据从控制器传递到视图和下一个请求.ViewData和ViewBag几乎相似,TempData承担额外的责任.让我们讨论或获得这三个对象的关键点:

ViewBag和ViewData之间的相似之处:

从控制器移动到视图时,有助于维护数据.

用于将数据从控制器传递到相应的视图.

短寿命意味着当重定向发生时,值变为空.这是因为他们的目标是提供一种在控制器和视图之间进行通信的方法.它是服务器调用中的通信机制.

ViewBag和ViewData之间的区别:

ViewData是一个对象字典,它是从ViewDataDictionary类派生的,可以使用字符串作为键访问.

ViewBag是一个动态属性,它利用了C#4.0中的新动态功能.

ViewData需要对复杂数据类型进行类型转换,并检查空值以避免错误.

ViewBag不需要对复杂数据类型进行类型转换.

ViewBag和ViewData示例:

public ActionResult Index()
{
    ViewBag.Name = "Monjurul Habib";
    return View();
}


public ActionResult Index()
{
    ViewData["Name"] = "Monjurul Habib";
    return View();
} 

在视图中:

@ViewBag.Name 
@ViewData["Name"] 

TempData的:

TempData也是一个从TempDataDictionary类派生的字典,存储在短生命会话中,它是一个字符串键和对象值.不同之处在于物体的生命周期.TempData保存HTTP请求时间的信息.这仅意味着从一个页面到另一个页面.这也适用于302/303重定向,因为它位于相同的HTTP请求中.当您从一个控制器移动到另一个控制器或从一个操作移动到其他操作时,有助于维护数据.换句话说,当您重定向时,"TempData"有助于维护这些重定向之间的数据.它在内部使用会话变量.在当前和后续请求期间使用临时数据仅意味着在您确定下一个请求将重定向到下一个视图时使用它.它需要对复杂数据类型进行类型转换,并检查空值以避免错误.

public ActionResult Index()
{
  var model = new Review()
            {
                Body = "Start",
                Rating=5
            };
    TempData["ModelName"] = model;
    return RedirectToAction("About");
}

public ActionResult About()
{
    var model= TempData["ModelName"];
    return View(model);
}

最后一种机制是Session,它像ViewData一样工作,就像一个字典,它接受键的字符串和值的对象.这个存储在客户端Cookie中,可以使用更长时间.它还需要更多验证才能永远不会有任何机密信息.关于ViewData或ViewBag,您应该智能地使用它来提高应用程序性能.因为每个动作都经历了常规asp.net mvc请求的整个生命周期.您可以在子操作中使用ViewData/ViewBag,但请注意不要使用它来填充可能污染控制器的无关数据.



3> 小智..:

TempData的

基本上它就像一个DataReader,一旦读取,数据就会丢失.

看看这个视频

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        String str = TempData["T"]; //Output - T
        return View();
    }
}

如果您注意上面的代码,RedirectToAction对TempData没有任何影响,直到读取TempData.因此,一旦读取了TempData,值就会丢失.

如何在阅读后保留TempData?

检查操作方法测试1和测试2中的输出

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";
        TempData["T"] = "T";
        return RedirectToAction("About");
    }

    public ActionResult About()
    {
        return RedirectToAction("Test1");
    }

    public ActionResult Test1()
    {
        string Str = Convert.ToString(TempData["T"]);
        TempData.Keep(); // Keep TempData
        return RedirectToAction("Test2");
    }

    public ActionResult Test2()
    {
        string Str = Convert.ToString(TempData["T"]); //OutPut - T
        return View();
    }
}

如果您注意上面的代码,RedirectToAction之后以及读取数据之后数据不会丢失,原因是,我们正在使用TempData.Keep().就是它

通过这种方式,只要您希望在其他控制器中也可以保持它.

ViewBag /的ViewData

数据将持久保存到相应的视图

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有